Django报错求助:Reverse for 'update'带空参数未找到匹配路由
搞定Django Reverse for 'update' 报错问题
嘿,我来帮你解决这个头疼的反向解析报错!先拆解下核心问题:报错信息Reverse for 'update' with arguments ('',) not found,意思是你在模板里生成update链接时,传入的post_id是空字符串,但你的URL规则vehicles_app/(?P<post_id>[0-9]+)/update_post/$要求这个参数必须是数字,所以匹配失败了。
下面是几个最可能的原因和对应的解决办法,你挨个排查:
1. 循环里的对象没有有效的id值
你模板里肯定写了类似{% url 'update' obj.id %}的代码来生成更新链接,但当前循环的某个obj的id是空的(或者压根没这个字段)。
- 先确认你的模型:Django默认会给每个模型加自增的
id主键,除非你自定义了其他主键字段(比如post_id)。如果是自定义主键,那模板里得用对应的字段名,比如obj.post_id。 - 可以在视图里加个调试打印,看看传给模板的
context里每个对象的id情况:
# 在你的视图函数里临时加这段代码,运行后看控制台输出 print([obj.id for obj in context])
要是输出里有空值,那得检查你的数据来源,确保要展示的对象都有合法的id值。
2. 模板里的变量名写错了
比如你模型里的主键字段叫post_id,但模板里写成了obj.id,这就会传空值过去。仔细核对模型的字段名和模板里用的变量名,必须完全一致。
3. URL的name参数和模板里的调用不匹配
去你的vehicles_app/urls.py里看看,update_post这个URL的name是不是设成了'update'?正确的写法应该是:
path('<int:post_id>/update_post/', views.update_view, name='update')
如果name是别的(比如'update_post'),那模板里{% url 'update' ... %}就找不到对应的URL,得把名称统一起来。
4. 过滤掉无效对象(临时应急方案)
如果确实有一些没有id的对象不需要展示,或者不需要给它们加更新链接,那可以:
- 在视图里过滤掉这些无效对象:
context = YourModel.objects.exclude(id__isnull=True)
- 或者在模板里加个判断,只给有有效
id的对象生成链接:
{% for obj in context %} <div class="container" style="padding-left:240px; padding-right:0px; width: 78%; margin-bottom:30px;"> <div class="well" style="background-color:..."> {% if obj.id %} <a href="{% url 'update' obj.id %}">编辑</a> {% endif %} <!-- 其他内容 --> </div> </div> {% endfor %}
先从第一个原因开始排查,大概率是对象的id为空或者变量名写错了,应该能很快解决!
内容的提问来源于stack exchange,提问作者Foki
相关产品推荐
相关产品推荐

