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

これを達成する方法はありますか?

注: を持っていない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 は、チケット#8620のコミットb16dd1fe019でこれに対処しました。Django 1.7では、OPが示唆するようにサブクラスで行うことが可能になります。コミットのドキュメントの変更から:nickname = None

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 の列を無視します)

したがって、私の目的では、2 番目の方法を使用します。

于 2015-02-11T12:28:53.497 に答える