UpdateView - 使用User更新具有OneToOne的类

时间:2014-10-05 07:47:00

标签: django django-class-based-views

假设我有一个名为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

感谢

2 个答案:

答案 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-betterformsMultiform and ModelMultiForm

示例:

class UserProfileMultiForm(MultiForm):
    form_classes = {
        'user': UserForm,
        'profile': ProfileForm,
    }

它适用于通用CBV(CreateView,UpdateView,WizardView)。