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

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']

问题原因

  1. 参数名不匹配:URL规则中定义的路径参数是<protein_id>,但视图函数show_protein接收的参数是proteins_id,模板中传递protein.id时,Django无法将参数映射到正确的变量名,导致参数传递为空。
  2. 视图函数语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:12:02