Правильный способ наследования полей формы 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 сериализатора работает довольно хорошо.

Вернуться на верх