Django+AJAX实现点赞功能时出现POST 404错误求助
解决Django AJAX点赞功能的404错误及相关问题
你遇到的404 (Not Found)错误,核心原因和代码里的几处细节问题我帮你梳理清楚,一步步修正就能解决:
1. 先搞定404路由问题
你的forum应用里已经定义了like/的路由,但主项目的根URL配置没有包含forum应用的路由,导致Django找不到http://localhost:8000/forum/like/这个路径。
打开项目根目录的urls.py,添加对forum应用URL的引用:
from django.contrib import admin from django.urls import path, include # 确保导入include urlpatterns = [ path('admin/', admin.site.urls), path('forum/', include('forum.urls')), # 新增这一行,把forum的路由挂载到/forum/路径下 ]
2. 修复视图里的两处代码错误
你的toggle_like视图有两个小问题,会导致功能异常:
json.dump是写入文件的方法,生成JSON字符串应该用json.dumpsquestion.likes.count是方法引用,需要加括号调用才能拿到实际数量:question.likes.count()
修正后的视图代码:
import json from django.http import HttpResponse from django.views.decorators.http import require_POST from .models import Question from django.shortcuts import get_object_or_404 @require_POST def toggle_like(request): user = request.user slug = request.POST.get('slug', None) question = get_object_or_404(Question, slug=slug) if question.likes.filter(id=user.id).exists(): question.likes.remove(user) else: question.likes.add(user) context = {'likes-count': question.likes.count()} return HttpResponse(json.dumps(context), content_type='application/json')
3. 修复前端JS的this指向问题
你用了箭头函数() => {},箭头函数不会绑定自身的this,导致$(this).attr('name')拿不到按钮的slug值。换成普通函数就能解决:
$('#like').click(function() { $.ajax({ method: 'POST', url: "{% url 'forum:toggle-like' %}", data: { 'slug': $(this).attr('name'), 'csrfmiddlewaretoken': '{{ csrf_token }}' }, dataType: 'json', success: (response) => { // 成功后更新页面上的点赞数,提升用户体验 $('p:contains("Likes:")').text(`Likes: ${response['likes-count']}`); // 还可以切换按钮文本,比如变成"Unlike" }, error: (response, error) => { alert(response.responseText); } }) })
另外注意:你之前的success回调里用了response.message,但视图返回的是likes-count,所以改成更新页面点赞数的逻辑更合理。
把这些修改完成后,点击点赞按钮就不会再出现404错误,也能正常实现无刷新点赞/取消点赞的功能了。
内容的提问来源于stack exchange,提问作者Felipe Netto
相关产品推荐
相关产品推荐

