【发布时间】:2020-08-19 05:15:11
【问题描述】:
我使用 ajax 为我的 django 博客创建了一个赞按钮,但我收到一个错误,它计数不正确,起初它的 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.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 %}
views.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})
【问题讨论】:
标签: javascript jquery django django-rest-framework django-views