'使用ModelForm作为form_class'问题更新ViewView

时间:2013-07-16 13:22:38

标签: django django-class-based-views django-forms

我想获得的代码是一个页面,其中包含一个字段的简单形式,可以使用UpdateView更改用户的电子邮件地址。

听起来很简单,但难点在于我希望网址映射url(r'email/(?P<pk>\d+)/$', EmailView.as_view(),)不要使用我的ModelForm(id)中使用的模型的User,而是{ {1}}另一个模型id)。

特定用户的Profile实例的id可以在视图中按如下方式调用:Profile。如果您想知道,我正在使用可重复使用的应用userenaself.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的话。

1 个答案:

答案 0 :(得分:2)

让您的视图和模型表单对应不同的模型对我来说似乎不是一个好主意。

我会在model = User中设置EmailView,然后覆盖get_object,以便返回与给定个人资料ID对应的用户。