无法在一个视图中更新User和UserProfile?

时间:2016-03-27 11:11:51

标签: python django django-models django-forms django-views

我使用UpdateView更新用户帐户。用户包括User和UserProfile,如下所示:

class UserProfile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='userprofile')
    telephone = models.CharField(max_length=40,null=True)

现在,我已经创建了一个类UpdateView,以便能够更新例如UserProfile - 电话有效。

FORM:

class UserProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('telephone',)

URLS:

url(r'^edit-profile$',view=views.UserUpdate.as_view(),name='user_update'),

查看:

# @login_required
class UserUpdate(UpdateView):
    form_class = UserProfileUpdateForm
    context_object_name = 'user_update'
    template_name = 'auth/profiles/edit-profile.html'
    success_url = 'success url'

    def get_object(self,queryset=None):
        return self.request.user.userprofile

    def form_valid(self, form):
        #save cleaned post data
        clean = form.cleaned_data
        self.object = form.save()
        return super(UserUpdate, self).form_valid(form)

现在,我希望能够更改属于User的某些属性以及属于UserProfile的某些属性。

我已经尝试更改UserProfileUpdateForm字段变量,但它根本不起作用...

class UserProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('telephone','model.user.first_name',) <- this does not work, I want to add to the form attribute 'first_name' which belongs to User, not UserProfile

您是否知道如何使用UpdateView更改电话号码,first_name,last_name等?

2 个答案:

答案 0 :(得分:2)

UpdateView仅用于处理一个没有关系的模型。然而,精彩的django-extra-views库为模型和内联关系提供了CBV。

class UserProfileInline(InlineFormSet):
    model = models.UserProfile
    form = UserProfileUpdateForm
    extra = 0
    def get_factory_kwargs(self):
        kwargs = super(UserProfileInline,self).get_factory_kwargs()
        kwargs.update({"min_num": 1})
        return kwargs

class UserCreate(CreateWithInlinesView):
    model=User
    inlines = [UserProfileInline]
    form_class = UserForm
    success_url = reverse('some-success-url')
    # REQUIRED - fields or exclude fields of User model
    template_name = 'your_app/user_profile_update.html'

请务必查看documentation,了解有关传递给模板的变量以及如何使用inline formsets的信息。

答案 1 :(得分:0)

您还必须为User创建第二个表单。然后将其传递给与UpdateView相同的form_class

注意*:您可能需要覆盖get的{​​{1}}和post方法。 This SO answer可能有所帮助。

在一个UpdateView标记下的一个模板中渲染两个表单:

<form>