Django的:从表子类中删除字段(Django: Remove a field from a Fo

2019-07-22 11:07发布

class LoginForm(forms.Form):
    nickname = forms.CharField(max_length=100)
    username = forms.CharField(max_length=100)
    password = forms.CharField(widget=forms.PasswordInput)


class LoginFormWithoutNickname(LoginForm):
    # i don't want the field nickname here
    nickname = None #??

有没有一种方法来实现这一目标?

注:我没有ModelForm ,所以Meta带班exclude不起作用。

Answer 1:

您可以通过重写init方法改变在子类中的字段:

class LoginFormWithoutNickname(LoginForm):
    def __init__(self, *args, **kwargs):
        super(LoginFormWithoutNickname, self).__init__(*args, **kwargs)
        self.fields.pop('nickname')


Answer 2:

Django的1.7解决了这个在提交b16dd1fe019门票#8620 。 在Django 1.7,可以做到nickname = None子类中作为OP暗示。 从提交的文档更改:

这是可能的退出从Field被阴影它从一个父类继承。 虽然任何非Field值适用于这个目的,建议使用None ,使其明确一个领域正在被废止。



Answer 3:

我发现,请如果有兴趣发表评论。

(在Django 1.7.4)延伸的形式,用下面的代码:

class MyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

        for key, field in self.fields.iteritems():
            self.fields[key].required = False

    class Meta:
        model = MyModel
        exclude = []

    field_1 = forms.CharField(label="field_1_label")
    field_2 = forms.CharField(label="field_2_label", widget=forms.Textarea(attrs={'class': 'width100 h4em'}),)
    field_3 = forms.CharField(label="field_3_label", widget=forms.TextInput(attrs={'class': 'width100'}),)
    field_4 = forms.ModelChoiceField(label='field_4_label', queryset=AnotherModel.objects.all().order_by("order") )

class MyForm_Extended_1(MyForm):
    field_1 = None


class MyForm_Extended_2(MyForm):
    class Meta:
        model = MyModel
        exclude =[
                    'field_1',
                ]

MyForm_Extended_1设置field_1为无,(dB为单位的列被更新为Null)

MyForm_Extended_2忽略字段(忽略在保存在DB中的列)

所以,我的目的,我用的是第二种方法。



Answer 4:

我不喜欢这样的事实(或让我明白),一个场中使用第二类排斥“类元:”还导致未使用的字段在数据库之中。

也许最简单的方法是定义具有由两个类共享领域的抽象类。 然后,上面的两个原始类成为这个新类的子类。 因此,在这个线程开始给出的例子可能如下。 这是更多的代码,但这样一来,你扩展子类,而不是从一个超类做一个(不完全)排除在外。

class LoginForm_Common(forms.Form):
    username = forms.CharField(max_length=100)
    password = forms.CharField(widget=forms.PasswordInput)
    class Meta:
        abstract = True

class LoginForm(LoginForm_Common):
    nickname = forms.CharField(max_length=100)

class LoginFormWithoutNickname(LoginForm_Common):
    pass


文章来源: Django: Remove a field from a Form subclass