Django所有者登录时如何在UpdateView中更新客户用户资料
问题根源
当前视图CustomerUpdateView默认从Customer查询集取实例传给表单,但CustomerModelForm绑定的模型是User,模型不匹配直接导致两个问题:表单无法读取关联User的字段值渲染占位,提交时也无法定位到要更新的User记录。
修复方案
- 重写视图的
get_object方法,返回Customer关联的User实例UpdateView所有表单初始化、保存操作都依赖get_object返回的模型实例,只要重写这个方法,就能让表单直接操作关联的User对象,不需要额外修改表单逻辑,修改后的视图代码如下:
# views.py class CustomerUpdateView(OwnerAndLoginRequiredMixin, generic.UpdateView): template_name = "customer_update.html" form_class = CustomerModelForm queryset = Customer.objects.all() def get_object(self, queryset=None): # 按url传入的pk匹配对应Customer记录 customer = super().get_object(queryset=queryset) # 返回和Customer一对一绑定的User实例给表单使用 return customer.user def get_success_url(self): return "/customers"
- 效果验证
修改完成后不需要调整其他代码即可满足需求:- GET访问更新页时,表单会自动拉取对应User的
email、username、first_name、last_name字段值填充到输入框作为占位 - POST提交表单时,会直接更新关联的User记录,不会生成新的用户数据
- GET访问更新页时,表单会自动拉取对应User的
补充说明
如果后续给Customer模型新增自有字段,不要直接把两个模型的字段塞到同一个ModelForm里,可以在视图中实例化两个表单分别渲染,提交时分别校验、保存两个模型的实例即可。
内容的提问来源于stack exchange,提问作者Kedar Raul
相关产品推荐
相关产品推荐

