假设我有一个名为MyUser
的模型。它有一些领域,其中一个就是这个领域:
user = OneToOneField(User,related_name ='more_user_information')
我想创建一个更新此模型的视图,并执行以下操作:
Class AccountEdit(LoginRequiredMixin, UpdateView):
model = MyUser
form_class = MyUserForm
template_name = 'accounts/edit.html'
def get_object(self, queryset=None):
return self.model.objects.get(user=self.request.user)
MyUser
中的每个字段都可以进行编辑,但user
除外。这个一对一的字段是一个选择下拉框。我喜欢做的是编辑User
模型上的字段,如名字或姓氏。
如何在延长UpdateView
的同时实现这一目标?或者也许shuold我使用FormView
?
感谢
答案 0 :(得分:2)
这个问题实际上与基于类的视图或更新视图无关 - 这是一个从一开始就存在的基本问题,即:
ModelForms只编辑一个模型的字段,而不是递归到 外键。
换句话说,如果您有这样的模型:
class MyModel(models.Model):
a = models.ForeignKey('Foo')
b = models.ForeignKey('Bar')
c = models.ForeignKey('Zoo')
name = models.CharField(max_length=200)
模型表单将呈现三个选择字段,每个字段对应一个外键,这些选择字段将包含列出这些模型的所有值 - 以及名称的一个文本字段。
要解决此问题,您需要使用InlineFormSets
:
内联表单集是模型表单集之上的一个小抽象层。 这些简化了通过外部处理相关对象的情况 键。
您应该使用优秀的django-extra-views
应用中的InlineFormSet
。为此,您还要为相关对象创建一个视图:
class MyUserInline(InlineFormSet):
model = MyUser
def get_object(self):
return MyUser.objects.get(user=self.request.user)
class AccountEditView(UpdateWithInlinesView):
model = User
inlines = [MyUserInline]
答案 1 :(得分:1)
另一个选项是django-betterforms的Multiform and ModelMultiForm。
示例:
class UserProfileMultiForm(MultiForm):
form_classes = {
'user': UserForm,
'profile': ProfileForm,
}
它适用于通用CBV(CreateView,UpdateView,WizardView)。