1. ホーム
  2. python

[解決済み] Django カスタムフォームパラメータをフォームセットへ渡す

2022-04-26 07:33:35

質問

<ブロッククオート

これは、Django 1.9で修正された フォーム_kwargs .

私はこのようなDjango Formを持っています。

class ServiceForm(forms.Form):
    option = forms.ModelChoiceField(queryset=ServiceOption.objects.none())
    rate = forms.DecimalField(widget=custom_widgets.SmallField())
    units = forms.IntegerField(min_value=1, widget=custom_widgets.SmallField())

    def __init__(self, *args, **kwargs):
        affiliate = kwargs.pop('affiliate')
        super(ServiceForm, self).__init__(*args, **kwargs)
        self.fields["option"].queryset = ServiceOption.objects.filter(affiliate=affiliate)

こんな感じでこのフォームを呼び出しています。

form = ServiceForm(affiliate=request.affiliate)

ここで request.affiliate はログインしているユーザーです。これは意図したとおりに動作します。

問題は、この単一のフォームをフォームセットにしたいことです。フォームセットを作成する際に、アフィリエイトの情報を個々のフォームにどのように渡せばいいのかがわかりません。ドキュメントによると、このフォームセットを作成するには、次のようにする必要があるようです。

ServiceFormSet = forms.formsets.formset_factory(ServiceForm, extra=3)

そして、このように作成する必要があるのです。

formset = ServiceFormSet()

さて、この方法で個々のフォームにaffiliate=request.affiliateを渡すにはどうしたらいいでしょうか?

解決方法は?

私なら functools.partial functools.wraps :

from functools import partial, wraps
from django.forms.formsets import formset_factory

ServiceFormSet = formset_factory(wraps(ServiceForm)(partial(ServiceForm, affiliate=request.affiliate)), extra=3)

これは最もクリーンなアプローチであり、ServiceForm に何ら影響を与えない(サブクラス化を困難にする)と思います。