修复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.

我正在使用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.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对象,为什么您的代码与我的代码执行相同的操作,但它更长。您的代码执行相同的操作,但它更长。