Проблема с подсчетом в блоге django: использование ajax - PullRequest
0 голосов
/ 04 мая 2020

Я создал кнопку «Мне нравится» для моего django блога, используя ajax, но я получаю сообщение об ошибке, что он не считается должным образом, сначала его 0, как в сообщении, когда я нажимаю, как он работает, 1, как появился с непохожим кнопка, но когда я нажимаю в отличие и снова нравится, это дает 2 лайка, а иногда, когда я в отличие от него, показывает -1, как я думаю, это jQuery проблема, я не эксперт в jQuery

jQuery коде

$(document).ready(function() {
  function updateText(btn, newCount, verb) {
      btn.text(newCount + " " + verb)
  }

  $(".like-btn").click(function(e) {
    e.preventDefault()
    var this_ = $(this)
    var likeUrl = this_.attr("data-href")
    var likeCount = parseInt(this_.attr("data-likes")) |0
    var addLike = likeCount + 1
    var removeLike = likeCount - 1
    if (likeUrl){
       $.ajax({
        url: likeUrl,
        method: "GET",
        data: {},
        success: function(data){
          console.log(data)
          var newLikes;
          if (data.liked){
              updateText(this_, addLike, "Unlike")
          } else {
              updateText(this_, removeLike, "Like")
              // remove one like
          }

        }, error: function(error){
          console.log(error)
          console.log("error")
        }
      })
    }
  })
})

post_details. html:

 {% if user not in post.likes.all %}
           <p><a class='like-btn' data-href='{{ object.get_api_like_url }}'
                 data-likes='{{ object.likes.all.count }}' href='{{ object.get_like_url }}'>
               {{ object.likes.all.count }} Like</a></p>
  {% else %}
            <p><a class='like-btn' data-href='{{ object.get_api_like_url }}'
                 data-likes='{{ object.likes.all.count }}' href='{{ object.get_like_url }}'>
                {{ object.likes.all.count }} Unlike</a></p>
  {% endif %}

View.py

class PostLikeToggle(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
          obj = get_object_or_404(Post, pk=kwargs['pk'])
          url_ = obj.get_absolute_url()
          user = self.request.user
          if user.is_authenticated:
             if user in obj.likes.all():
                obj.likes.remove(user)
             else:
                obj.likes.add(user)
          return url_

   from rest_framework.views import APIView
   from rest_framework.response import Response
   from rest_framework import authentication, permissions
   from django.contrib.auth.models import User

   class PostLikeApiToggle(APIView):

        authentication_classes = [authentication.SessionAuthentication]
        permission_classes = [permissions.IsAuthenticated]

        def get(self, request, pk, format=None):

            obj = get_object_or_404(Post, pk=pk)
            url_ = obj.get_absolute_url()
            user = self.request.user
            updated = False
            liked =False
            if user.is_authenticated:
               if user in obj.likes.all():
                  liked = False
                  obj.likes.remove(user)
               else:
                   liked = True
                   obj.likes.add(user)
            updated = True
            data = {
                   "updated":updated,
                    "liked":liked
                   }

           return Response(data)

Models.py

class Post(models.Model):

     title = models.CharField(max_length=200)
     author = models.ForeignKey(User,on_delete=models.CASCADE)
     likes =models.ManyToManyField(User,blank=True,related_name='post_likes')
     content = models.TextField()
     img = models.ImageField(upload_to='pics',blank=True)
     time = models.DateTimeField(default=timezone.now)

     def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('LoveTravel-Details', kwargs={'pk': self.pk})

    def get_like_url(self):
       return reverse('Like-Toggle', kwargs={'pk':self.pk})

    def get_api_like_url(self):
       return reverse('Like-Api-Toggle', kwargs={'pk':self.pk})
...