Django中NoReverseMatch错误排查及解决过程
Django NoReverseMatch 错误排查与解决
初始错误:Reverse for 'show-protein' not found
报错信息:
Exception Type: NoReverseMatch Exception Value: Reverse for 'show-protein' not found. 'show-protein' is not a valid view function or pattern name.
问题原因
- 应用
urls.py已设置app_name = "abampdb",模板中调用URL时必须加上命名空间前缀(abampdb:show-protein),否则Django无法定位到对应应用的URL规则。 - 目标URL规则
path('show_protein/<protein_id>', ...)要求传递路径参数,但模板中{% url 'show-protein' %}未提供任何参数,不符合匹配要求。
二次错误:Reverse for 'show-protein' with arguments '('',)' not found
报错信息:
NoReverseMatch at /abampdb/get/ Reverse for 'show-protein' with arguments '('',)' not found. 1 pattern(s) tried: ['abampdb/show_protein/(?P<proteins_id>[^/]+)\\Z']
问题原因
- 参数名不匹配:URL规则中定义的路径参数是
<protein_id>,但视图函数show_protein接收的参数是proteins_id,模板中传递protein.id时,Django无法将参数映射到正确的变量名,导致参数传递为空。 - 视图函数语法错误:
Proteins().objects.get(pk=proteins_id)是错误写法,不应先实例化模型类再调用objects管理器,正确写法是直接调用Proteins.objects.get(...)。
最终解决方案
1. 修正模板URL生成代码
使用关键字参数明确指定参数名,确保与视图函数的参数名一致:
<a href="{% url 'abampdb:show-protein' proteins_id=protein.pk %}">{{ protein.name }}</a>
- 用
protein.pk替代protein.id是更通用的写法,可适配自定义主键的场景。
2. 修复视图函数的模型查询代码
def show_protein(request, proteins_id): # 移除不必要的模型实例化操作 protein = Proteins.objects.get(pk=proteins_id) return render(request, 'abampdb/show_protein.html', {'protein': protein})
额外建议
- 保持URL路径参数名、视图函数参数名、模板传递的关键字参数名三者完全一致,避免参数匹配混乱。
- 关键字参数的可读性和容错性优于位置参数,推荐在模板生成URL时优先使用。
内容的提问来源于stack exchange,提问作者Farha Anwer
相关产品推荐
相关产品推荐

