Правильный способ наследования полей формы django
EnquiryForm
это модель формы с большим количеством полей, я не могу наследовать поля родительской формы с помощью наследования.
class EnquiryForm(models.ModelForm):
...
possession = forms.ChoiceField(
required=True,
choices=(('', '----Select----'),) +
models.Enquiry._meta.get_field('possession').choices,
widget=forms.Select(attrs={'class': 'form-control btn btn-primary'})
)
...
# It has several other fields and clean method to manipulate user inputs and form validation
class EditForm(EnquiryForm):
possession_month = forms.ChoiceField(label='Possession Month',
required=True,
choices=MONTHS.choices,
widget=forms.Select(
attrs={'class': 'form-control btn btn-primary', 'required':True})
)
possession_year = forms.ChoiceField(choices=possession_year_choices(
datetime.now().year + 10, datetime.now().year),
label='Possession Year',
required=True,
widget=forms.Select(
attrs={'class': 'form-control btn btn-primary', 'required':True})
)
class Meta(EnquiryForm.Meta):
model = models.Enquiry
fields = EnquiryForm.Meta.fields + ('possession_month', 'possession_year', )
Обратите внимание, что здесь (последняя строка) я обращаюсь напрямую к EnquiryForm.Meta.fields
. но я пытался получить доступ к нему через наследование super().fields
класса Meta
, но безуспешно.
Можем ли мы наследовать fields
через Meta
наследование, например super(EnquiryForm.Meta).fields
.
P.S. - Также мне нужно убрать поле possession
из parent Meta.fields
в EditForm
.
Вы можете переопределить метод get_fields вашего сериализатора:
class EditForm(EnquiryForm):
def get_fields(self):
fields = super().get_fields()
fields['possession_month'] = forms.ChoiceField(label='Possession Month', required=True, choices=MONTHS.choices, widget=forms.Select(attrs={'class': 'form-control btn btn-primary', 'required':True}))
fields['possession_year'] = forms.ChoiceField(choices=possession_year_choices(datetime.now().year + 10, datetime.now().year), label='Possession Year', required=True, widget=forms.Select(attrs {'class': 'form-control btn btn-primary', 'required':True}))
del fields['possession']
return fields
Но и переопределение свойства Meta сериализатора работает довольно хорошо.