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

Django如何调整传递给UpdateView的主键以匹配目标User模型实例

解决方案

第一步:调整模板传参与路由匹配规则

首先修改模板的链接参数,将传递的其他模型主键替换为两个模型共有的username值:

<a href="{% url 'new_url' model_instance.username %}">
    {{ model_instance.username }}
</a>

接着修改urls.py中的对应路由规则,将原本匹配int类型主键的规则改为匹配字符串类型的username:

# 修改前的路由示例
# path('user/update/<int:pk>/', UserUpdateView.as_view(), name='new_url')
# 修改后的路由
path('user/update/<str:username>/', UserUpdateView.as_view(), name='new_url')

如果username仅包含字母、数字、下划线、连字符这类标准slug字符,可使用<slug:username>替代<str:username>做更严格的参数校验。

第二步:重写UserUpdateView的实例查询方法

Django原生UpdateView默认通过pk或slug参数查询目标实例,你需要重写get_object方法,改用路由传递的username查询User实例:

from django.shortcuts import get_object_or_404

class UserUpdateView(generic.UpdateView):
    template_name = "leads/update.html"
    queryset = User.objects.all()
    context_object_name = "user"
    form_class = UserUpdateForm

    def get_object(self, queryset=None):
        if queryset is None:
            queryset = self.get_queryset()
        # 从路由参数中获取username
        username = self.kwargs.get("username")
        # 按username查询对应的User实例,查不到则返回404
        return get_object_or_404(queryset, username=username)

    def get_success_url(self):
        return reverse("some-url")

注意:请确保User模型的username字段设置了unique=True约束,避免同用户名匹配到多个实例导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:54:03