限制用户在Views.py中仅在模型中喜欢该帖子一次,

时间:2019-06-09 17:43:51

标签: python django

我知道我可以在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)

1 个答案:

答案 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()中查找“作弊者”