Django模板引用模型pk报错:修改主键类型后URL反向解析失败
你对pk的理解没有问题,Django确实会将模型定义的主键字段自动映射到pk属性调用,本次报错完全是URL路由配置不匹配导致的。
核心错误原因
你在urls.py中给update_product路径配置的是<int:pk>路径转换器,该转换器仅支持匹配纯数字类型的参数。你将模型主键修改为CharField类型的ProductName后,pk返回的值是字符串(比如报错里的Biomass),无法匹配int转换器的校验规则,因此URL反向解析失败。
修复方案
修改urls.py中的路由配置,将int转换器替换为适配字符串的str转换器:
# 原配置 # path('update_product/<int:pk>', UpdateProductView, name="update_product"), # 修改后配置 path('update_product/<str:pk>', UpdateProductView, name="update_product"),
如果你的ProductName字段包含斜杠等特殊字符,可以根据需求替换为更宽松的slug或path转换器。
其他代码隐患修复
你现有的代码还存在几处逻辑错误,同步调整即可:
- 删除视图中多余的更新操作:你已经调用
form.save()完成了数据更新,后续三次filter(pk=pk).update()属于重复操作,直接删除即可,避免不必要的数据库请求。 - 修正表单初始值的取值逻辑:else分支中你错误使用模型类
Products取属性,应该使用你查询到的实例对象Product:
# 原错误写法 # form = UpdateProductForm(initial = { # 'Name' : Products.ProductName, # 'Category' : Products.ProductCategory, # 'OH' : Products.StockOnHand}, instance =Product) # 修改后 form = UpdateProductForm(initial = { 'Name' : Product.ProductName, 'Category' : Product.ProductCategory, 'OH' : Product.StockOnHand}, instance =Product)
- 不推荐将模型实例列表直接存入session:Django的默认session序列化规则无法直接序列化模型实例,容易触发隐性错误,需要数据时直接从数据库查询即可。
内容的提问来源于stack exchange,提问作者Murcielago
相关产品推荐
相关产品推荐

