I am trying to create a "like" button where each time a user likes the post, the count will increase by one and add the user's name to it. When I click my button, only the csrf token passes through. What is wrong with my code that I cannot get the photo_id to pass through?
Thank you in advance!
views.py:
def like_ajax(request):
if request.is_ajax() and request.POST:
like_item_id = request.POST.get('photo_id', '')
try:
new_like = LikeItem.objects.get(id=like_item_id)
except:
new_like = None
if new_like:
message = "success"
if request.user in new_like.likers.all():
new_like.likers.add(request.user)
new_like.save()
like_count = add_new.likers.count()
did_like = True
else:
new_like.likers.remove(request.user)
new_like.save()
vote = add_new.likers.count()
did_like = False
else:
message = 'error'
like_count = 0
did_like = False
data = {
"did_like": did_like,
"like_count": like_count,
"message": message,
}
new_data = json.dumps(data)
return HttpResponse(new_data, content_type='application/json')
else:
raise Http404
models.py:
class LikeItem(models.Model):
likers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='Likers', null=True, blank=True)
image = models.ForeignKey(Photo)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True, default=timezone.now())
jquery:
$('.like_btn').click(function(e){
e.preventDefault();
$photo_id = $(this).attr("photo_id");
$button = $(this);
$.ajax({
type: "POST",
url: "{% url 'like_ajax' %}",
data: {
'photo_id': $photo_id,
csrfmiddlewaretoken: "{{ csrf_token }}",
},
dataType: "json",
success: function(data) {
if (data.liked) {
data.like_count;
// do something after item is liked
// can get count with data.like_count
} else {
data.like_count;
// item is no longer liked
}
},
error: function (rs, e) {
alert('Sorry, there was an error with your request. Please try again later.');
}
});
});
html button:
<button class="like_btn btn btn-info" value="photo_id" type="button">Like this</button>
Aucun commentaire:
Enregistrer un commentaire