【问题标题】:restricting user to like the post once in Views.py not in model限制用户在 Views.py 中而不是在模型中喜欢帖子
【发布时间】:2019-06-09 17:43:51
【问题描述】:

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

【问题讨论】:

  • 因为这段代码没有意义。 pkid 意思相同。您所做的只是检查当前用户是否存在,这显然是存在的。

标签: python django


【解决方案1】:

首先关于错误: 在“if”语句中,您试图通过 post 主键查找用户。此外,您正在通过 id 和 pk 执行搜索,而在您的情况下它们在技术上是相同的。见:Django queries - id vs pk

关于实施: 恐怕不可能在您的实施中跟踪“作弊者”。如果不存储喜欢,您将无法理解“此用户已喜欢此帖子”。没有数据告诉你这个事实。 “Else”部分是可以的,但如果您想跟踪“likers”,则需要进行一些自定义。

最简单的选择是将引用 User 的 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() 以查找“骗子”

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2018-10-13
    • 2020-09-11
    相关资源
    最近更新 更多