我使用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等?
答案 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>