Django中submit_review路由匹配失败求助:NoReverseMatch错误排查
解决NoReverseMatch错误及星级评分表单问题
错误根源分析
从错误信息和代码来看,核心问题有两处:
1. URL路由反向解析失败
错误提示"找不到无参数的submit_review路由",但你的路由submit_review/<int:game_id>/明确要求传入整数类型的game_id参数。问题可能出在:
- 命名空间缺失:如果主
urls.py通过命名空间包含Action应用路由(比如path('', include('Action.urls', namespace='action'))),模板调用URL时必须加命名空间前缀,否则Django无法定位正确路由。 - 参数异常:模板中的
description.id可能不存在或不是整数,无法匹配<int:game_id>的路由规则。
2. 模型字段赋值错误
视图里data.user__id=request.user.id是错误写法,Django模型中外键字段赋值应使用user_id(字段名+_id)或直接赋值用户对象data.user=request.user,user__id是查询时的双下划线语法,不能用于直接赋值。
分步解决方案
步骤1:修复URL反向解析
情况A:主urls.py使用命名空间
如果主urls.py配置如下:
from django.urls import path, include urlpatterns = [ # 其他路由 path('', include('Action.urls', namespace='action')), ]
模板中的URL调用必须添加命名空间前缀:
<form action="{% url 'action:submit_review' description.id %}" method="POST">
情况B:主urls.py未使用命名空间
先验证description.id是否存在且为整数,可在模板临时添加打印:
<!-- 临时验证参数 --> <p>Game ID: {{ description.id }}</p> <form action="{% url 'submit_review' description.id %}" method="POST">
若description.id为空或非整数,检查action_description视图是否正确传递description对象到模板。
步骤2:修复模型字段赋值错误
修改views.py中用户ID的赋值代码:
# 替换错误写法 # data.user__id=request.user.id # 改为以下二者之一: data.user_id = request.user.id # 或者 data.user = request.user
步骤3:补充GET请求处理
当前视图仅处理POST请求,若用户通过GET访问submit_review路由会报错,建议添加GET请求逻辑:
def submit_review(request,game_id): url = request.META.get('HTTP_REFERER') if request.method == 'POST': # 原POST处理逻辑 ... # 处理GET请求,重定向回原页面或首页 else: return redirect(url) if url else redirect('action')
验证测试
- 重启Django服务器
- 访问游戏详情页,检查表单
action属性是否生成类似/submit_review/3444/的正确URL - 提交测试评分,确认评论可正常添加/更新且无报错
内容的提问来源于stack exchange,提问作者Byansi
相关产品推荐
相关产品推荐

