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

Django中传入指定ID的URL出现404页面未找到错误

问题分析与解决方案

一、404错误的可能原因及排查步骤

1. URL路由未正确配置

  • 检查项目根目录的urls.py是否正确包含了该路由所在的应用URL配置。例如,如果该路由在myapp/urls.py中,根urls.py需要有类似如下配置:
    from django.urls import path, include
    
    urlpatterns = [
        # 其他路由...
        path('', include('myapp.urls')),  # 确保没有额外前缀,否则访问URL需要加上前缀(如/api/likecomment/6/)
    ]
    
  • 确认路由定义顺序:如果有其他路由(比如path('likecomment/', ...))在该re_path之前,虽不会匹配/likecomment/6/,但仍需确保当前路由是第一个能匹配目标URL的规则。

2. 模型引用错误

  • 检查视图中Comment模型的导入是否正确,确保是从对应应用的models.py导入,而非其他同名模型:
    # 正确导入示例(假设Comment在comments应用中)
    from comments.models import Comment
    
  • 通过Django Shell直接查询验证对象是否存在:
    python manage.py shell
    
    from your_app.models import Comment
    Comment.objects.get(id=6)  # 如果报错说明对象确实不存在,否则说明视图查询逻辑有问题
    

3. 路由参数传递异常

  • 临时在视图开头添加打印语句,确认comment_id是否正确接收:
    def LikeComment_view(request, comment_id):
        print("Received comment_id:", comment_id)  # 检查控制台输出是否为6
        comment = get_object_or_404(Comment, id=comment_id)
        # 后续代码...
    

二、视图函数中的逻辑错误(非404原因,但需修复)

即使解决了404问题,当前视图代码仍会抛出AttributeError,因为模型中定义的多对多字段是liked_users,而视图中错误使用了comment.liked(liked是User模型的反向关联名)。修复如下:

def LikeComment_view(request, comment_id):
    comment = get_object_or_404(Comment, id=comment_id)
    # 替换comment.liked为comment.liked_users
    if not comment.liked_users.filter(id=request.user.id).exists():
        comment.likes += 1
        comment.liked_users.add(request.user)
        comment.save()
    else:
        comment.likes -= 1
        comment.liked_users.remove(request.user)
        comment.save()

三、额外优化建议

  • 建议使用path而非re_path简化路由定义(Django 2.0+支持):
    path('likecomment/<int:comment_id>/', LikeComment_view, name="LikeComment_page"),
    
  • 避免手动维护likes字段计数,可通过信号或直接查询liked_users.count()获取实时点赞数,减少数据不一致风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:55:04