列表未正常填充?页面刷新时bug的views仍每次自增1
问题分析与解决方案
嘿,我一眼就瞅出问题所在啦!你当前的代码里,users列表是每次HTTP请求进来都会重新初始化的空列表——这意味着不管用户之前有没有访问过这个bug,只要刷新页面,这个列表就会被重置为空,所以user in users永远是False,每次都会执行else分支给views自增1。
修正思路
我们需要一个能跨请求保留用户访问记录的存储方式,Django的session就是最方便的选择(它会和用户的会话绑定,临时存储用户的浏览痕迹)。
修改后的代码
user = request.user form = BugCommentForm() comments = BugComment.objects.filter(bug__pk=bug.pk) comments_total = len(comments) # 从session中获取用户已浏览过的bug ID列表,默认是空列表 viewed_bugs = request.session.get('viewed_bugs', []) current_bug_id = bug.pk # 检查当前bug是否已经被用户浏览过 if current_bug_id not in viewed_bugs: bug.views += 1 bug.save() # 将当前bug ID添加到浏览记录中,并更新session viewed_bugs.append(current_bug_id) request.session['viewed_bugs'] = viewed_bugs
额外说明
- 这个方案对登录用户和匿名用户都生效,因为Django会给匿名用户分配一个会话ID。
- 如果需要更持久的访问记录(比如用户换浏览器后仍能识别),可以考虑在数据库中新增一个
BugView模型,记录用户ID和bug ID的对应关系,不过session已经能解决大部分场景的需求啦。
内容的提问来源于stack exchange,提问作者Jorden
相关产品推荐
相关产品推荐

