如何使用户只能在Django中点赞/不喜欢一次? [英] How to make user to Like/Dislike post only for once in Django?

查看:121
本文介绍了如何使用户只能在Django中点赞/不喜欢一次?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

几天前开始学习Django,但现在我仍然遇到这个问题。
这是一个博客网站,目前我正在使用喜欢/不喜欢的功能。
现在,已通过身份验证的用户可以根据自己的意愿多次喜欢同一条帖子。
我想我的模型有问题。 (或者在我看来,它的条件)
我将非常感谢您的帮助和说明! :)

Started learning Django a few days ago but now I'm stuck with this issue. It's a blog website and i'm working with like/dislike function at the moment. For now authenticated user can like the same post as many times as he wants. I guess there's problem with my model. (Or maybe its conditions in my view) I would be very grateful for the help and clarifications! :)

这是我的模型(Post.py):

Here's my model (Post.py):

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Пользователь", related_name='author')
    title = models.CharField(max_length=80, verbose_name="Название")
    body = models.TextField(verbose_name="Текст публикации")
    created = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
    modified = models.DateTimeField(auto_now=True, verbose_name="Дата обновления")
    description = models.CharField(max_length=400,verbose_name = "Описание")
    reading_time = models.PositiveSmallIntegerField(verbose_name="Время для чтения в минутах")
    likes = models.PositiveIntegerField(default=0)
    dislikes = models.PositiveIntegerField(default=0)
    users_reaction = models.ManyToManyField(User, blank=True, verbose_name='Реакция юзеров', related_name='react')

我的观点(发布.py):

My view (Post.py):

class UserReactionView(View):
    template_name='post.html'

    def get(self, request, *args, **kwargs):
        post_id = self.request.GET.get('post_id')
        post = Post.objects.get(id = post_id)
        like = self.request.GET.get('like')
        dislike = self.request.GET.get('dislike')
        post_user_reactions = Post.objects.filter(user=request.user)
        if like and (request.user not in post_user_reactions.all()):
            post.likes += 1
            post.users_reaction.add(request.user)
            post.save()
        if dislike and (request.user not in post_user_reactions.all()):
            post.dislikes += 1
            post.users_reaction.add(request.user)
            post.save()
        data = {
            'likes': post.likes,
            'dislikes': post.dislikes
        }

        return JsonResponse(data)

模板中的jquery块

And jquery block in the template

{% block jquery %}
<script>
  $(document).ready(function(){
      $('#like').on('click', function(e){
          e.preventDefault()
          var post_id = {{ post.pk }}
          var like = 'like'

          data = {
              post_id: post_id,
              like: like
          }
          $.ajax ({
              type:"GET",
              url:"{% url 'blog:user_reaction'  post.pk%}",
              dataType: 'json',
              data: data,
              success: function(data){
                  $('#liked').html(data.likes)
                  $('#disliked').html(data.dislikes)

              }
          })
      })

  })

     $(document).ready(function(){
           $('#dislike').on('click', function(e){
          e.preventDefault()
          var post_id = {{ post.pk }}
          var dislike = 'dislike'

          data = {
              post_id: post_id,
              dislike: dislike
          }
          $.ajax ({
              type:"GET",
              url:"{% url 'blog:user_reaction' post.pk %}",
              dataType: 'json',
              data: data,
              success: function(data){
                  $('#liked').html(data.likes)
                  $('#disliked').html(data.dislikes)

              }
          })
      })

  })
</script>

 {% endblock %}


推荐答案

您的查询错误:

post_user_reactions = Post.objects.filter(user=request.user)

此查询过滤掉 request.user 创建的所有帖子

This query filters out all the posts that request.user has created.

像这样更改它:

post_obj = Post.objects.get(id = post_id)
# Now get all the users that reacted to this post.
post_user_reactions = post_obj.users_reaction.all()

if like and (request.user not in post_user_reactions):
    ...
if dislike and (request.user not in post_user_reactions):
    ...

这篇关于如何使用户只能在Django中点赞/不喜欢一次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆