首页 > 解决方案 > 如果用户已经喜欢了一个帖子,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.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 %}

和like_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 %}

所以有了这一切,我如何让用户只被允许喜欢一次帖子。我只是初学者,所以请解释一下。

标签: pythonhtmldjango

解决方案


如果我的问题是正确的,您希望用户能够喜欢一次帖子,并且当用户第二次点击喜欢按钮时,它应该“不喜欢”,对吗?

如果是这样,这就是你应该做的:

在你的 Post 模型中,like 应该是这样likes = models.ManyToManyField(User, related_name='user_likes')的,a 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')

这样,如果用户单击赞按钮,他将被添加到likes Field,如果他再次单击它,他将被删除,似乎他已经在那里。因此,用户将无法多次喜欢帖子。


推荐阅读