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

Django ProfileUpdateView报错:URL需传pk或slug,不想用pk如何解决?

解决Django ProfileUpdateView使用username而非pk的问题

问题根源

  • 初始错误是因为UpdateView默认要求URL提供pk或slug参数,且默认用slug字段匹配,但User模型没有该字段,直接设置slug_url_kwarg = 'name'会导致字段匹配失败。
  • 代码存在小疏漏:template属性应为template_name,否则视图无法正确加载模板文件。

修复方案

给ProfileUpdateView添加两个关键属性,明确指定用username字段匹配URL中的name参数,同时修正模板属性名:

修改后的views.py代码

class ProfileUpdateView(UpdateView):
    model = User
    form_class = ProfileForm
    template_name = 'blog/user.html'  # 修正template为template_name
    slug_field = 'username'  # 指定用User模型的username字段做匹配
    slug_url_kwarg = 'name'  # 对应URL配置里的<slug:name>参数

    def dispatch(self, request, *args, **kwargs):
        self.user_item = self.get_object()  # 利用UpdateView内置方法获取对象,无需重复查询
        if self.user_item.username != self.request.user.get_username():
            return redirect('login')
        return super().dispatch(request, *args, **kwargs)

    def get_success_url(self):
        username = self.kwargs['name']
        return reverse('blog:profile', kwargs={'name': username})

代码说明

  1. slug_field = 'username':告诉UpdateView,用User模型的username字段替代默认的slug字段作为查询匹配依据。
  2. slug_url_kwarg = 'name':指定URL中传递的参数名为name,和URL配置里的<slug:name>对应。
  3. 修正template为template_name:这是Django通用视图指定模板的标准属性名,之前的写法会导致视图找不到模板。
  4. 简化对象查询:用self.get_object()替代手动调用get_object_or_404,这是UpdateView内置方法,会自动根据slug_field和slug_url_kwarg获取对象,更符合CBV设计规范。

额外说明

URL配置无需修改,保持原有写法即可:

path('edit_profile/<slug:name>', views.ProfileUpdateView.as_view(), name='edit_profile'),

这里的<slug:name>可以正常匹配username(username通常只包含字母、数字、下划线和连字符,符合slug格式要求);如果需要支持特殊字符,也可以改成<str:name>。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:15:19