修复django视图计数器
我正在使用Django创建一个博客,我想计算每个帖子的浏览量。当用户阅读博客文章时,我调用此函数:修复django视图计数器,django,session-cookies,Django,Session Cookies,我正在使用Django创建一个博客,我想计算每个帖子的浏览量。当用户阅读博客文章时,我调用此函数: def post_detail(request, post_id): if 'viewed_post_%s' % post_id in request.session: pass else: print "adding" add_view = Post.objects.get(id=post_id) add_view.
def post_detail(request, post_id):
if 'viewed_post_%s' % post_id in request.session:
pass
else:
print "adding"
add_view = Post.objects.get(id=post_id)
add_view.views += 1
add_view.save()
request.session['viewed_post_%s' % post_id] = True
return render(request, 'blog/detail.html', {'Post': Post.objects.get(id=post_id)})
问题是,当注销并再次登录时,post视图再次增加。那么,为什么django会在用户注销时删除会话?我如何修复此问题?您不能依靠会话来存储此类永久信息,因为会话是临时的 最简单的方法是添加一个附加模型:
class UserSeenPosts(models.Model):
user = models.ForeignKey(User, related_name='seen_posts')
post = models.ForeignKey(Post)
然后像这样做:
def post_detail(request, post_id):
post = Post.objects.get(id=post_id)
if not request.user.seen_posts.filter(post_id=post_id).exists():
print "adding"
post.views += 1
post.save()
UserSeenPosts.objects.create(user=request.user, post=post)
return render(request, 'blog/detail.html', {'Post': post})
希望有帮助 您不能依靠会话来存储此类永久信息,因为
会话是临时的
最简单的方法是添加一个附加模型:
class UserSeenPosts(models.Model):
user = models.ForeignKey(User, related_name='seen_posts')
post = models.ForeignKey(Post)
然后像这样做:
def post_detail(request, post_id):
post = Post.objects.get(id=post_id)
if not request.user.seen_posts.filter(post_id=post_id).exists():
print "adding"
post.views += 1
post.save()
UserSeenPosts.objects.create(user=request.user, post=post)
return render(request, 'blog/detail.html', {'Post': post})
希望有帮助 我想编辑Jahongir Rahmonov的答案,因为它不适合我
post_详细信息功能:
def post_detail(request, post_id):
post = Post.objects.get(id=post_id)
if UserSeenPosts.objects.filter(post=post, user=request.user).exists():
pass
else:
post.views += 1
post.save()
UserSeenPosts.objects.create(user=request.user, post=post)
return render(request, 'blog/detail.html', {'Post': Post.objects.get(id=post_id)})
我想编辑Jahongir Rahmonov的答案,因为它不适合我
post_详细信息功能:
def post_detail(request, post_id):
post = Post.objects.get(id=post_id)
if UserSeenPosts.objects.filter(post=post, user=request.user).exists():
pass
else:
post.views += 1
post.save()
UserSeenPosts.objects.create(user=request.user, post=post)
return render(request, 'blog/detail.html', {'Post': Post.objects.get(id=post_id)})
不,即使用户以前查看过帖子,它也会计数:(我在管理面板中注册了UserSeenPosts,当用户查看帖子时,它不会创建UserSeenPosts对象,为什么即使用户以前查看过帖子,它也不会计数:(我在“管理”面板中注册了UserSeenPosts,当用户查看帖子时,它没有创建UserSeenPosts对象,为什么您的代码与我的代码执行相同的操作,但它更长。您的代码执行相同的操作,但它更长。