解决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
相关产品推荐
相关产品推荐

