Python ModelForm.Meta中的条件字段

Python ModelForm.Meta中的条件字段,python,django,Python,Django,假设我们在Django应用程序中有一个自定义用户模型。为了使它可以从管理页面进行修改,我们需要定义一些表单 下面是用于修改自定义用户模型实例的UserChangeForm class UserChangeForm(forms.ModelForm): class Meta: model = MyCustomUser fields = ( ..., 'email', 'is_activ

假设我们在Django应用程序中有一个自定义用户模型。为了使它可以从管理页面进行修改,我们需要定义一些表单

下面是用于修改自定义用户模型实例的
UserChangeForm

class UserChangeForm(forms.ModelForm):

    class Meta:
        model  = MyCustomUser
        fields = (
            ...,
            'email',
            'is_active',
            'is_admin',
            'groups',
            ....
        )
问题是:如何基于模型实例在
Meta
类中实现条件
字段
(即超出Meta的范围)?

目标是声明如下内容

def get_fields(self):
    if self.instance.is_company:
        return ('email', 'company_name', 'headquarters')
    else:
       return ('email', 'first_name', 'last_name')

在外部类中,找到将函数结果注入
Meta.fields
的方法。有什么想法吗?

您可以在
\uuuu init\uuuu()构造函数中删除表单中的字段:

class UserChangeForm(forms.ModelForm):

    class Meta:
        fields = ('email', 'company_name', 'headquarters',
                           'first_name', 'last_name', )

    def __init__(self, *args, **kwargs):
        super(UserChangeForm, self).__init__(*args, **kwargs)
        if self.instance.is_company:
            fields_to_delete = ('first_name', 'last_name')
        else:
            fields_to_delete = ('company_name', 'headquarters')
        for field in fields_to_delete:
            del self.fields[field]

您可以从
\uuuu init\uuuu()
构造函数中的表单中删除字段:

class UserChangeForm(forms.ModelForm):

    class Meta:
        fields = ('email', 'company_name', 'headquarters',
                           'first_name', 'last_name', )

    def __init__(self, *args, **kwargs):
        super(UserChangeForm, self).__init__(*args, **kwargs)
        if self.instance.is_company:
            fields_to_delete = ('first_name', 'last_name')
        else:
            fields_to_delete = ('company_name', 'headquarters')
        for field in fields_to_delete:
            del self.fields[field]

如果您使用的是Django管理员,那么可以使用该方法


如果您使用的是Django管理员,那么可以使用该方法


干得好。顺便问一下,你有没有一个链接来解释那些
Meta
类在幕后是如何工作的?我很惊讶,我们只需要做一个
self.fields
就可以访问这些字段(而不是像我预期的那样
self.Meta.fields
)。
字段的表单API
:做得很好。顺便问一下,你有没有一个链接来解释那些
Meta
类在幕后是如何工作的?我很惊讶,我们只需要做一个
self.fields
就可以访问这些字段(而不是像我预期的那样
self.Meta.fields