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
相关产品推荐
相关产品推荐

