我对“赞”功能有疑问。我想尽可能地喜欢这篇文章,而不会使整个页面超载。所以我用CBV django连接到ajax。
我的问题是它通过按“赞”按钮收到:Not Found: /like/
。
我的看法:
class PostLikeView(generic.View):
def post(self, request):
post = get_object_or_404(Post, id=request.POST.get('id'))
is_liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
is_liked = False
else:
post.likes.add(request.user)
is_liked = True
context = {
'post': post,
'is_liked': is_liked,
'total_likes': post.total_likes(),
}
if request.is_ajax():
html = render_to_string('post/like_section.html', context, request=request)
return JsonResponse({'form': html})
下面是jquery代码:
<script type="text/javascript">
$(document).ready(function(event){
$(document).on('click', '#like', function(event){
event.preventDefault;
var pk = $(this).attr('value');
$.ajax({
type: 'POST',
url: "{% url 'post:post_like' %}",
data: {'id': pk, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: 'json',
success: function(response){
$('#like-section').html(response['form'])
console.log($('#like-section').html(response['form']))
},
error: function(rs, e){
console.log(rs.responseText);
},
});
});
});
</script>
网址以查看:
url(r'^like/$', login_required(PostLikeView.as_view()), name='post_like'),
html中的代码:
<form action="{% url 'post:post_like' %}" method="post">
{% csrf_token %}
{% if is_liked %}
<button type="submit" id="like" name="post_id" value="{{ post.id }}" class="btn btn-danger">Dislike</button>
{% else %}
<button type="submit" id="like" name="post_id" value="{{ post.id }}" class="btn btn-primary">Like</button>
{% endif %}
</form>
我希望按钮可以不重新加载整个页面的原理来工作。
最佳答案
我认为的问题是,您实际上并未在点击事件处理程序中调用event.preventDefault
(缺少括号)。这意味着提交按钮将提交表单,但是表单不包含名为id
的参数,因此get_object_or_404(Post, id=request.POST.get('id'))
会引发404。
将缺少的方括号添加到event.preventDefault
,还请注意,HTML元素上的id=
属性的值应为unique within the page。更改id=
元素上的<button>
属性的值,以使其唯一。