Django 如何覆盖modelformset中modelform的字段?
我有一个特殊情况,用户应该能够更改交易状态,但不能更改Django 如何覆盖modelformset中modelform的字段?,django,Django,我有一个特殊情况,用户应该能够更改交易状态,但不能更改deal\u类型。因此,我认为我将下拉列表的小部件更改为文本字段 因此,我想在我的表单集中覆盖deal_type的小部件,我将其子类化为BaseModelFormSet,并将其作为参数传递给工厂: deal_formset = modelformset_factory(Deal, formset=BaseDealFormSet, fields = {'status', 'deal_type'}, extra=0) class Deal(m
deal\u类型
。因此,我认为我将下拉列表的小部件更改为文本字段
因此,我想在我的表单集中覆盖deal_type的小部件,我将其子类化为BaseModelFormSet
,并将其作为参数传递给工厂:
deal_formset = modelformset_factory(Deal, formset=BaseDealFormSet, fields = {'status', 'deal_type'}, extra=0)
class Deal(models.Model):
deal_id = UUIDField()
status = models.ForeignKey(DealStatus)
deal_type = models.ForeignKey(DealType)
class BaseDealFormSet(BaseModelFormSet):
deal_type = forms.CharField(max_length=30, widget=forms.TextInput( attrs={'readonly': 'True'}))
def clean_deal_type(self):
return self.instance.deal_type
但是,在模板{{fs.deal_type}
中,小部件仍然显示为下拉列表,而不是文本字段
我甚至不确定,这是否会完全按照我的预期工作,即将下拉列表的选定值视为文本字段。但至少我应该看到小部件的变化,对吗?但它似乎完全被忽视了
我错过了什么?谢谢,您需要使用自定义项创建一个ModelForm子类,并将其作为
form
参数传递给modelformset\u factory
class DealForm(forms.ModelForm):
deal_type = forms.CharField(max_length=30,
widget=forms.TextInput(attrs={'readonly': 'True'}))
def clean_deal_type(self):
return self.instance.deal_type
...
deal_formset = modelformset_factory(Deal, form=DealForm,
fields=['status', 'deal_type'], extra=0)
注意,这样做有相当大的灵活性,
字段可以放在表单的内部元类中,您可以保留modelformset子类并将表单声明放在那里,等等。您需要使用自定义创建ModelForm子类,并将其作为form
参数传递给modelformset\u工厂
class DealForm(forms.ModelForm):
deal_type = forms.CharField(max_length=30,
widget=forms.TextInput(attrs={'readonly': 'True'}))
def clean_deal_type(self):
return self.instance.deal_type
...
deal_formset = modelformset_factory(Deal, form=DealForm,
fields=['status', 'deal_type'], extra=0)
注意,这样做有相当大的灵活性,字段可以放在表单的内部元类中,您可以保留modelformset子类并将表单声明放在那里,等等。ahh。在这种情况下,如何覆盖实际表单?因为modelformset\u工厂
正在直接创建模型的表单。啊,对了。在这种情况下,如何覆盖实际表单?因为modelformset\u工厂
正在直接创建模型的表单。