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ことに注意してください。フォームの内部メタクラスに入れることができ、modelformsetサブクラスを保持して、そこにフォーム宣言を置くことができます。

于 2012-07-31T09:25:05.307 に答える