2

我有一个特殊情况,用户应该能够更改交易的状态,但不能更改deal_type. 因此,我想我将下拉列表的小部件更改为文本字段。

因此,我想在我的表单集中覆盖 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}}中,小部件仍显示为下拉列表,而不是文本字段。

我什至不确定,如果这完全按照我的预期工作,那就是将下拉列表的选定值视为文本字段。但至少我应该看到小部件的变化,对吧?但它似乎完全被忽略了。

我错过了什么?谢谢,

4

1 回答 1

2

您需要使用自定义创建一个 ModelForm 子类,并将其作为form参数传递给modelformset_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)

请注意,您如何执行此操作具有相当大的灵活性 -fields可以进入表单的内部 Meta 类,您可以保留您的 modelformset 子类并将表单声明放在那里,等等。

于 2012-07-31T09:25:05.307 回答