只希望用户“赞”一次评论。我的代码不起作用

时间:2018-04-30 09:32:58

标签: python django django-models django-views

我有Post模型,上面有一个字段likes_total。我只希望用户能够喜欢一次帖子,但视图中的代码不起作用。这是代码:

views.py

def like(request, post_id, group_id):
    group = get_object_or_404(Group, pk= group_id)
    post =  get_object_or_404(Post, pk= post_id)
    likers = []

    if request.method == 'POST':
        if request.user in likers:
            return render(request, 'groups/detail.html', {'group':group, 'error': "you have already liked this post"} )
        else:
            post.likes_total += 1
            post.save()
            likers.append(request.user)
            return redirect('/groups/' + str(group_id) )
        # post.save()
    else:
        return render(request, 'groups/detail.html', {'group':group})

这段代码对我来说似乎是正确的,不能说出问题是什么......任何帮助都会非常感激!

3 个答案:

答案 0 :(得分:1)

每次调用函数时,都会将likers设置为空。相反,它应该是帖子的属性。

答案 1 :(得分:0)

您的likers列表未在任何地方保留,并且始终初始化为空列表,因此request.user永远不会出现在列表中。

您应该编辑模型,以便每个Post对象都有一个喜欢它的用户列表,然后您可以保留,更新和检查该列表,以确保每个用户最多只喜欢每个帖子一次

答案 2 :(得分:0)

您在 likers函数中定义名为like 的列表。这意味着每次有人调用like函数时,您都会构建一个 new 和空列表。

您可以在函数外部构建列表,但这也无济于事。实际上,您可以考虑的唯一数据 persistent (您可以插入/修改/删除的数据,以便下一次调用看到这种差异)在数据库中。

因此,您应该让数据库存储喜欢帖子的人,例如向引用喜欢发帖的用户的ManyToManyField模型添加Post。所以你应该编辑模型:

class Post(Model):

    likers = ManyToManyField(User)
    # some other fields
    likes_total = IntegerField()

现在我们可以将喜欢帖子的用户添加到多对多关系中:

def like(request, post_id, group_id):
    group = get_object_or_404(Group, pk= group_id)
    post =  get_object_or_404(Post, pk= post_id)

    if request.method == 'POST':
        if request.user in post.likers.all():
            return render(request, 'groups/detail.html', {'group':group, 'error': "you have already liked this post"} )
        else:
            post.likes_total += 1
            post.likers.add(request.user)
            post.save()
            return redirect('/groups/' + str(group_id) )
    else:
        return render(request, 'groups/detail.html', {'group':group})

您可以进行的另一项改进是使用reverse生成网址,而不是自己构建网址。