我有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})
这段代码对我来说似乎是正确的,不能说出问题是什么......任何帮助都会非常感激!
答案 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
生成网址,而不是自己构建网址。