【问题标题】:Change the model that modelForm's save, is saving更改modelForm保存的模型,正在保存
【发布时间】:2014-05-12 08:35:48
【问题描述】:

假设我有一个父类 MyUser 的 modelForm,它保存了用户的公共信息。

用户有一个名为 role 的字段,指示他们所处的角色,我有 3 个特殊模型,用于 3 个角色。

我想要做的是在保存表单时检查表单的角色字段。如果它是这 3 个特殊角色之一,我想保存特殊模型(它是 MyUser 的孩子)而不是 MyUser ,否则,我希望 save 方法正常执行。(保存实际的 MyAbstractUser)。

class MyUserForm(forms.ModelForm):


    retyped_pass = forms.CharField(label='Password Confirmation', widget=forms.PasswordInput, max_length=30, required=True)
    class Meta:
        model = MyUser

    def save(self, ?):
        if self.fields['role'] == 'researcher'
             save ResearcherUser instead of MyUser
        ....
        else: # if none of above
             save MyUser

特殊用户类型有 ResearcherUser、ProducerUser 和 CenterUser,如果角色不是这 3 种,我希望它是 MyUser。

知道如何实现这一点吗?
在此先感谢:)

【问题讨论】:

    标签: python django forms django-models


    【解决方案1】:

    假设MyUser 的模型表单中的字段与您的特殊用户类型的字段完全相似,您可以这样做

    def save(self, *args, **kwargs):
            if self.fields['role'] == 'researcher'
                 return ResearchUser.objects.get_or_create( **self.fields)
            ....
            else: # if none of above
                 super(MyUserForm, self).save(*args, **kwargs)
    

    注意:您可能希望使用比.get_or_create() 更好的东西,它会在提供的所有字段上查找现有对象。但它可能找不到并尝试创建新的。

    请参阅 the docs 了解具体行为。

    【讨论】:

      猜你喜欢
      • 2015-03-13
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2013-05-13
      • 1970-01-01
      • 2013-08-02
      • 2017-08-12
      相关资源
      最近更新 更多