You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django类视图结合Ajax实现点赞功能时出现404错误求助

解决Django Ajax点赞的404 Not Found问题

咱们一步步排查并修复这个问题,404错误核心原因就是Ajax请求的URL和Django配置的路由不匹配,或者URL解析环节出了问题:

1. 检查URL命名空间配置是否正确

你在模板和JS里用了{% url 'post:post_like' %},这要求你的post应用路由必须被项目主路由正确包含且指定命名空间:

  • 打开项目根目录的urls.py,确认有类似配置:
    from django.urls import include, path
    
    urlpatterns = [
        # 其他路由配置...
        path('post/', include('post.urls', namespace='post')),  # 重点是namespace='post'
    ]
    
    如果没指定namespace,或者根本没把post应用的路由包含进来,模板里的post:post_like就无法解析成正确URL,直接导致Ajax请求发去错误地址。

2. 修复JavaScript里的event.preventDefault调用错误

你的JS代码里写的是:

event.preventDefault;

这里少了括号,方法根本没执行!应该改成:

event.preventDefault();

没加括号的话,表单会触发默认提交(页面跳转),同时Ajax请求行为异常,间接引发404或请求中断。

3. 确认URL匹配规则和生成的URL一致

你的路由配置是:

url(r'^like/$', login_required(PostLikeView.as_view()), name='post_like'),

这个规则要求URL必须以/like/(末尾带斜杠)结尾。你可以先在模板里手动测试URL生成:

  • 在HTML模板里加一行测试代码(之后可删除):

    <!-- 测试用 -->
    <p>生成的点赞URL:{% url 'post:post_like' %}</p>
    

    如果生成的URL是/like(不带斜杠),Django的APPEND_SLASH虽会重定向,但Ajax请求不会自动处理重定向,直接返回404。

    解决办法:要么把路由改成允许不带斜杠(r'^like/?$'),要么确保生成的URL带斜杠。

4. 验证视图与路由的关联是否正确

确认PostLikeView类定义在post应用的views.py里,且post应用的urls.py正确导入了这个视图:

# post/urls.py
from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from .views import PostLikeView

urlpatterns = [
    url(r'^like/$', login_required(PostLikeView.as_view()), name='post_like'),
]

如果视图导入错误,或者路由里的路径写错,也会触发404。

5. 用浏览器开发者工具确认实际请求URL

按F12打开开发者工具,切换到Network标签,点击点赞按钮,查看Ajax请求的URL:

  • 如果请求URL是/like/但仍404,说明路由匹配还有问题;
  • 如果请求URL是空或其他错误路径,说明模板里的{% url 'post:post_like' %}解析失败。

额外优化建议

  • 可以把URL存在按钮的data属性里,比如给按钮加data-url="{% url 'post:post_like' %}",JS里用var url = $(this).data('url');获取,更清晰;
  • 确保只有登录用户能看到点赞按钮,避免未登录用户触发无效请求。

按上面的步骤排查,应该能解决404问题,让无刷新点赞正常工作。

内容的提问来源于stack exchange,提问作者user10605113

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:01:31