кнопка «Мне нравится» ничего не делает - PullRequest
0 голосов
/ 02 июня 2019

Я хочу, чтобы пользователям понравился мой пост, поэтому я реализовал их здесь. вот мой код Это не дает никакой ошибки, которая расстраивает.

models.py

class Post(models.Model):

    title = models.CharField(max_length=100)
    content = models.TextField(blank=True, null=True)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)      
    url = models.URLField(max_length=250, blank=True, null=True)
    views = models.IntegerField(default=0)
    likes = models.ManyToManyField(User, related_name='likes')

    def __str__(self):
        return self.title

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

    def total_likes(self):
        return self.likes.count()


views.py

    def like(request):
        if request.method == 'POST':
            user = request.user # bring login user
            post_pk = request.POST.get('pk', None)
            post = Post.objects.get(pk = post_pk) #bring the post object.

            if post.likes.filter(id = user.id).exists(): #if exit
                post.likes.remove(user) #likes deleted.
                message = 'You disliked this'
            else:
                post.likes.add(user)
                message = 'You liked this'

        context = {'likes_count' : post.total_likes, 'message' : message}
        return HttpResponse(json.dumps(context), content_type='application/json')

urls.py

urlpatterns = [

    path('', PostListView.as_view(), name='community-home'),

    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
    path('post/<int:post_pk>/comment/new',views.comment_new, name='comment_new'),
    path('post/<int:post_pk>/comment/<int:pk>/edit',views.comment_edit, name='comment_edit'),
    path('post/<int:post_pk>/comment/<int:pk>/delete',views.comment_delete, name='comment_delete'),
    path('like/', views.like, name='like'),

мой HTML

<input type="button" class="like" name="{{ memo.id }}" value="Like">
      <p id="count{{ memo.id }}">count : {{ memo.total_likes }}</p>



<script type="text/javascript">
  for(i = 0; i < $(".writer_name").length; i++){
    if($("#user_name").text() == $(".writer_name")[i].innerHTML){
      $("#control_id"+i).removeClass("hidden");
    }
  }


$('.like').click(function(){
  var pk = $(this).attr('name') 
  $.ajax({
      type: "POST", 
      url: "{% url 'like' %}", 
      data: {'pk': pk, 'csrfmiddlewaretoken': '{{ csrf_token }}'}, 
      dataType: "json", 


      success: function(response){ 
        id = $(this).attr('name')
        $('#count'+ pk).html("count : "+ response.likes_count);
        alert(response.message);
        alert("likes :" + response.likes_count);
      },
      error:function(request,status,error){
        alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
      }
  });
})
</script>

Я не уверен, что мой ajax неправильный или мой питон неправильный. но для меня логика здесь имеет смысл. если кто-нибудь может сказать, в чем проблема, я был бы очень признателен. Спасибо

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Вы используете jquery, перед использованием вы должны обернуть код внутри:

$(document).ready(()=>{
...
});
0 голосов
/ 02 июня 2019
def like(request):
        response_json = request.POST
        response_json = json.dumps(response_json)
        data = json.loads(response_json)
        post = Post.objects.get(pk =data['pk'])
        if post.likes.filter(id = user.id).exists(): #if exit
            post.likes.remove(user) #likes deleted.
            message = 'You disliked this'
        else:
            post.likes.add(user)
            message = 'You liked this'

        context = {'likes_count' : post.total_likes, 'message' : message}
        return JsonResponse(context, safe=False)

попробуй вот так.Вы отправляете тип данных JSON, поэтому python должен интерпретировать его следующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...