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

使用Django UpdateView时出现'dict' object has no attribute 'pk'错误

Django UpdateView无法识别URL中pk参数的问题解决

问题概述

使用Django的UpdateView编辑Product模型时,URL中的pk参数无法被识别,触发以下错误:

Exception Type: AttributeError at /products/2001/update/
Exception Value: 'dict' object has no attribute 'pk'

错误原因

  1. get_queryset方法参数与访问方式错误:自定义重写的get_queryset错误添加了**kwargs参数,且试图用kwargs.pk访问pk值——但kwargs是字典类型,需用键值对(kwargs['pk'])访问;更关键的是,get_queryset默认不接收kwargs参数,URL路径参数实际存在于视图实例的self.kwargs字典中。
  2. get_queryset返回值不符合要求:该方法要求返回QuerySet对象,你却直接返回了单个Product实例,违反方法设计逻辑。
  3. 配置冗余冲突:同时设置form_class和fields,Django会优先使用form_class,fields配置会被忽略,属于冗余代码。

修复方案

方案1:移除不必要的get_queryset重写

UpdateView已内置根据pk获取对象的逻辑,只需指定model和form_class即可自动处理URL中的pk参数,无需自定义get_queryset:

修改后的views.py:

from django.views.generic import UpdateView
from django.urls import reverse_lazy
from .models import Product
from .forms import ProductForm

class ProductDetail(UpdateView):
    model = Product
    form_class = ProductForm
    template_name = "inventory/product-detail.html"
    # 使用reverse_lazy生成动态URL,避免硬编码
    success_url = reverse_lazy('product-success')

方案2:如需过滤查询集(可选)

如果需要对可编辑产品进行过滤(比如仅允许当前用户编辑自己的产品),正确重写get_queryset的方式如下:

def get_queryset(self):
    # 调用父类方法获取基础查询集
    queryset = super().get_queryset()
    # 添加自定义过滤逻辑,示例:仅显示当前用户的产品
    return queryset.filter(user=self.request.user)

优化URL配置(可选)

在urls.py中明确指定pk的整数类型,避免类型转换问题:

urlpatterns = [    
    path('<int:pk>/update/', views.ProductDetail.as_view(), name='product-detail'),
]

关键说明

  • URL路径参数自动存入视图的self.kwargs字典,获取时用self.kwargs['pk']而非直接接收kwargs参数。
  • get_queryset的核心作用是提供查询集范围,UpdateView会从中根据pk筛选具体对象,不要用它直接返回单个实例。
  • form_class和fields只需设置一个,同时设置会导致冗余,优先用form_class定制表单字段与验证逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:02:42