ape*_*ari 38 python forms django inheritance field
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 #??
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
注意:我没有ModelForm
,所以Meta
上课exclude
不起作用.
gar*_*rtb 66
您可以通过重写init方法来更改子类中的字段:
class LoginFormWithoutNickname(LoginForm):
def __init__(self, *args, **kwargs):
super(LoginFormWithoutNickname, self).__init__(*args, **kwargs)
self.fields.pop('nickname')
Run Code Online (Sandbox Code Playgroud)
cje*_*nek 10
Django 1.7在提交b16dd1fe019中为机票#8620解决了这个问题.在Django 1.7中,可以nickname = None
像OP建议的那样在子类中进行.从提交中的文档更改:
可以
Field
通过遮蔽来从父类继承选择退出.虽然任何非Field
值都可以用于此目的,但建议使用None
它来明确表示字段无效.
小智 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',
]
Run Code Online (Sandbox Code Playgroud)
MyForm_Extended_1将field_1设置为None,(db中的列更新为Null)
MyForm_Extended_2忽略该字段(在保存期间忽略db中的列)
因此,出于我的目的,我使用第二种方法。