【问题标题】:Right Way to inherit django form fields继承django表单字段的正确方法
【发布时间】:2021-10-26 04:35:37
【问题描述】:

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().fieldsMeta 类来访问它,但没有运气。

我们能否通过Meta继承fields,比如super(EnquiryForm.Meta).fields

附: - 另外,我必须在 EditForm 中从 parent Meta.fields 中删除字段 possession

【问题讨论】:

    标签: django forms inheritance


    【解决方案1】:

    您可以覆盖序列化程序的 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 属性也能很好地工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2012-01-19
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多