我知道我可以在models.py中轻松完成此操作,但是我的应用程序中没有模型。我有发布应用程序,并且有类似字段。所以我想在我的views.py中限制它 这是我的尝试,但我不明白为什么它不会限制它
@login_required
def like_post(request, pk):
if User.objects.filter(pk = pk, id = request.user.id).exists():
return HttpResponse('You already voted for this, cheater')
else:
liked_post = Post.objects.get(id=pk)
count = liked_post.likes
count += 1
liked_post.likes = count
liked_post.save()
return redirect('/community/post/%s' %liked_post.id)
答案 0 :(得分:0)
首先关于错误: 在“ if”语句中,您尝试通过后主键查找用户。此外,您在执行ID和PK搜索,但从技术上讲它们是相同的。参见:Django queries - id vs pk
关于实施: 恐怕不可能在您的实现中跟踪“骗子”。您无法理解“此用户已经喜欢此帖子”而不存储喜欢。没有任何数据可以告诉您这个事实。 “其他”部分还可以,但是如果您要跟踪“喜欢者”,则需要进行一些自定义。
最简单的选择是将引用用户的ManyToMany字段添加到您的Post模型中,并将其称为“ likers”。将在幕后创建带有“ user_id”,“ post_id”列的表格,并告知“此用户喜欢此帖子”。
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
...
likers = models.ManyToManyField(User)
...
在您的视图liked_post.likers.add(request.user)
中,将当前用户添加到喜欢者,并在liked_post.likers.filter(user=request.user).exists()
中查找“作弊者”