Python Django不允许另一个用户喜欢某个帖子

Python Django不允许另一个用户喜欢某个帖子,python,html,django,Python,Html,Django,我想允许用户只喜欢一篇文章一次。以下是我目前的代码: class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() date_posted = models.DateTimeField(default=timezone.now) author = models.ForeignKey(User, on_delete=models.CASC

我想允许用户只喜欢一篇文章一次。以下是我目前的代码:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    likes = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})
在views.py中:

def LikePostView(request, pk):
    post = get_object_or_404(Post, pk=pk)
    post.likes = post.likes+1
    post.save()
    return render(request, 'blog/like_done.html')
要在前端喜欢帖子的代码:

<p class="content">{{ post.likes }} likes</p>
{% if user.is_authenticated %}
   <a href='{% url "like_post" post.id %}'><i class="fa fa-thumbs-up" style="font-size:36px"></i></a>
{% else %}
   <a onclick="alert('In order to like a post, you must be logged in!')" href='{% url "blog-home" %}'><i class="fa fa-thumbs-up" style="font-size:36px"></i></a>
{% endif %}

{{post.likes}}likes

{%if user.u经过身份验证%} {%else%} {%endif%}
像_done.html一样:

{% extends "blog/base.html" %}
{% block content %}
    <h2 class="alert alert-success">Post Liked Successfuly!</h2>
    <br>
    <a class="btn btn-success" href="{% url 'blog-home' %}">Go Back Home?</a>
    <br>
{% endblock content %}
{%extends“blog/base.html”%}
{%block content%}
帖子喜欢成功!


{%endblock内容%}

那么,有了这些,我如何才能让用户只喜欢一篇帖子呢。我只是初学者,所以请解释一下。

如果我没弄错你的问题,你希望用户能够喜欢一篇文章一次,当用户第二次单击“喜欢”按钮时,它应该是“不喜欢”的,对吗

如果是这样,您应该这样做:

在您发布的模型中,like应该是这样的
likes=models.ManyToManyField(User,related\u name='User\u likes')
,一个
ManyToManyField

那么在你看来,

def LikePostView(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.user in post.likes.all():
       post.likes.remove(request.user)
    else:
       post.likes.add(request.user)
    return render(request, 'blog/like_done.html')

这样,如果用户单击like按钮,他将被添加到
likes字段
,如果他再次单击,他将被删除,似乎他已经在那里了。因此,用户不会多次喜欢帖子。

我认为您关于如何将其存储在数据库中的想法是不正确的。你只需要计算一篇文章的赞,然而真正的赞意味着一个用户可以喜欢很多文章(而且一篇文章可以被很多用户喜欢),所以你需要一个表(多对多),它可以跟踪
USER.id
以及
post.id
——这也是使其唯一的复合键。