You need to enable JavaScript to run this app. Django模板引用模型pk报错:修改主键类型后URL反向解析失败
优惠活动
大模型
产品
解决方案
定价
更多

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转换器。

其他代码隐患修复

你现有的代码还存在几处逻辑错误,同步调整即可:

  1. 删除视图中多余的更新操作:你已经调用form.save()完成了数据更新,后续三次filter(pk=pk).update()属于重复操作,直接删除即可,避免不必要的数据库请求。
  2. 修正表单初始值的取值逻辑: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)
  1. 不推荐将模型实例列表直接存入session:Django的默认session序列化规则无法直接序列化模型实例,容易触发隐性错误,需要数据时直接从数据库查询即可。

内容的提问来源于stack exchange,提问作者Murcielago

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 05:54:03