我对“赞”功能有疑问。我想让这篇文章成为可能,而不会使整个页面重载。所以我使用了连接到 ajax 的 CBV django。
我的问题是它收到:Not Found:/like/ 通过按“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 ,还要注意 id= 的值HTML 元素的属性应为 unique within the page .更改 id= 的值<button> 上的属性元素,以便它们是唯一的。
