我想获得的代码是一个页面,其中包含一个字段的简单形式,可以使用UpdateView
更改用户的电子邮件地址。
听起来很简单,但难点在于我希望网址映射url(r'email/(?P<pk>\d+)/$', EmailView.as_view(),)
不要使用我的ModelForm(id
)中使用的模型的User
,而是{ {1}}另一个模型id
)。
特定用户的Profile
实例的id
可以在视图中按如下方式调用:Profile
。如果您想知道,我正在使用可重复使用的应用userena的self.user.get_profile().id
模型。
Profile
的A(afaik未优化实施¹)特征是if you want to use your own ModelForm instead of letting the UpdateView
derive a form from a Model you need to(otherwise produces an Error) define either model
, queryset
or get_queryset
。
因此,对于我的UpdateView
案例,我做了以下事情:
forms.py
EmailView
views.py
class EmailModelForm(forms.ModelForm):
class Meta:
model = User
fields = (
"email",
)
def save(self, *args, **kwargs):
print self.instance
# returns <Profile: Billy Bob's Profile> instead of <User: Billy Bob> !!!
return super(EmailModelForm, self).save(*args, **kwargs)
然后我去了class EmailView(UpdateView):
model = Profile # Note that this is not the Model used in EmailModelForm!
form_class = EmailModelForm
template_name = 'email.html'
success_url = '/succes/'
。这是/email/2/
的电子邮件表单,user
profile
id
。
如果我在2
内运行调试器,我会得到:
EmailView
到目前为止一切顺利。但当我提交表单时,它不会保存。我可以覆盖>>> self.user.id
1
>>> profile = self.user.get_profile()
>>> profile.id
2
中的save
方法,但我宁愿覆盖EmailModelForm
中的某些内容。我怎么能这样做?
¹因为EmailView
可以从传递给UpdateView
属性的ModelForm派生模型类,如果它是ModelForm的话。
答案 0 :(得分:2)
让您的视图和模型表单对应不同的模型对我来说似乎不是一个好主意。
我会在model = User
中设置EmailView
,然后覆盖get_object
,以便返回与给定个人资料ID对应的用户。