Django路由Reverse for 'receipt'报错 产品ID详情页跳转失败
报错原因
- inventory.html模板中变量引用错误:inventory视图仅向该模板传递了
items变量,模板遍历items时的单个实例变量为i,但跳转链接中错误使用了不存在的products变量取id,导致生成url时参数为空,触发arguments '('',)'的报错。 - receipt.html模板逻辑错误:products视图传递给该模板的
products是单个模型实例,不属于可遍历的查询集,代码中多余的for循环会导致页面渲染报错。 - 可优化点:url配置中pk参数类型为字符串,和模型id的数字类型不匹配,可能出现非数字参数查询数据库的异常。
修复方案
1. 替换inventory.html的链接参数
将链接中的products.id替换为循环变量i.id:
{% for i in items %} <tr> <td>{{i.Name_of_the_Material_per_specification}}</td> <td>{{i.Site_Material_Code }}</td> <td><a class="btn btn-sm btn-info" href="{% url 'receipt' i.id %}">View</a></td> </tr> {% endfor %}
2. 清理receipt.html的多余逻辑
删除不必要的csrf_token和for循环,直接输出实例属性:
<div class="col-md"> <div class="card card-body"> <p>Name: {{products.Name_of_the_Material_per_specification}}</p> </div> </div>
3. (可选)优化urls.py的参数类型
将pk的参数类型修改为int,过滤非法请求:
from django.contrib import admin from django.urls import path, include from inventory import views urlpatterns = [ path('main', views.inventory, name='inventory'), path('receipt/<int:pk>/', views.products, name="receipt") ]
内容的提问来源于stack exchange,提问作者Nick Rizzolo
相关产品推荐
相关产品推荐

