44
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 #??

有没有办法做到这一点?

注意:我没有 a ModelForm,所以Meta带有的类exclude不起作用。

4

4 回答 4

78

您可以通过覆盖init方法来更改子类中的字段:

class LoginFormWithoutNickname(LoginForm):
    def __init__(self, *args, **kwargs):
        super(LoginFormWithoutNickname, self).__init__(*args, **kwargs)
        self.fields.pop('nickname')
于 2013-03-21T20:23:38.343 回答
11

Django 1.7 在提交b16dd1fe019的票证#8620中解决了这个问题。在 Django 1.7 中,可以nickname = None按照 OP 的建议在子类中进行操作。从提交中的文档更改:

Field可以通过遮蔽从父类继承来选择退出。虽然任何非Field值都适用于此目的,但建议使用None它来明确表示字段正在被无效。

于 2013-12-11T09:32:13.057 回答
5

我找到了,如果有兴趣请评论。

(在 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 设置为 None,(db 中的列更新为 Null)

MyForm_Extended_2 忽略字段(保存期间忽略db中的列)

因此,出于我的目的,我使用第二种方法。

于 2015-02-11T12:28:53.497 回答
3

我不喜欢这样一个事实(或者我理解),使用“class Meta:”排除第二类中的字段仍然会导致未使用的字段在数据库中。

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

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
于 2016-05-09T06:45:55.567 回答