You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决Django项目中Watchlist匹配查询不存在的报错问题

解决“Watchlist matching query does not exist”错误

错误原因

使用Watchlist.objects.get()方法时,若数据库中没有匹配当前用户和电影的Watchlist记录,会直接抛出DoesNotExist异常——这就是未加入收藏的电影详情页报错的核心原因。已加入收藏的电影能查询到对应记录,因此可以正常显示。

修改方案

1. 修正视图函数(views.py)

把get()方法替换为filter().first(),这样当没有匹配记录时会返回None,而非抛出异常:

def view_movie(request, mslug):
    user = request.user
    movie = Movie.objects.get(slug=mslug)
    # 改用filter+first,无匹配时返回None,避免抛出异常
    watchlist = Watchlist.objects.filter(user=user, movie=movie).first()
    return render(request, 'moviesingle.html', {'mov': movie, 'watchlist': watchlist})

注:直接使用已获取的movie对象作为查询条件,比通过movie__slug查询更高效。

2. 修正模板判断逻辑

模板中watchlist.is_none是错误写法,改为判断watchlist是否为空:

<div class="social-btn">
{% if not watchlist %}
<a href="{% url 'Watchlist:add_watchlist' mov.id %}" class="parent-btn">
<i class="ion-plus"></i> Add to Watchlist</a>
{% else %}
<a href="" class="parent-btn">
<i class="ion-heart"></i> Already in Watchlist</a>
{% endif %}
</div>

额外优化建议

给Watchlist模型添加联合唯一约束,避免同一用户重复添加同一部电影:

class Watchlist(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    date = models.DateField(auto_now_add=True)

    class Meta:
        unique_together = ('user', 'movie')  # 添加联合唯一约束

    def __str__(self):
        return self.movie.name

内容的提问来源于stack exchange,提问作者Miguel O'Hara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:24:53