6

私のDjangoアプリは、Djangoの管理アプリをテーマにするツールとしてDjangoSuitを使用しています。Suitが実行できることの1つは、次のようなウィジェットを形成するために要素を追加および追加することです。

class PropertyForm(ModelForm):
    class Meta:
        model = Property
        widgets = {
            'amount': EnclosedInput(prepend = "GBP"),
        }

効果は次のとおりです。

ここに画像の説明を入力してください

これは素晴らしい機能ですが、(擬似コードで)動的に追加できればもっと便利です。

'amount': EnclosedInput(prepend = my_model_instance.currency)

私は次のようにフォームの初期化をオーバーライドしようとしました:

class PropertyForm(ModelForm):

    def __init__(self, *args, **kwargs):
        inst = kwargs["instance"]
        self._meta.widgets["amount"] = EnclosedInput(prepend = inst.currency)
        super(PropertyForm, self).__init__(*args, **kwargs)

不思議なことに、これはinitメソッドにブレークポイントを設定した場合にのみ機能します。タイミングの問題があるようです。

だから私の質問は、これを実装するための最良の方法(もしあれば)は何でしょうか?

4

2 に答える 2

12

The problem is with:

self._meta.widgets["amount"] = EnclosedInput(prepend = inst.currency)

It turns out _meta is being cached. When I change the above line to (which also a nicer solution as _meta is probably private):

self.fields['amount'].widget = EnclosedInput(prepend = inst.currency)

...it works flawlessly

于 2013-03-14T09:13:23.143 に答える
1

簡単な方法は、必要になるたびにフォームクラスを構成することです。

def make_property_form(currency):
    class PropertyForm(forms.Form):
        # ...
        widgets = {
            'amount': EnclosedInput(prepend=currency),
        }
    return PropertyForm

def view_that_uses_my_form(request):
    # ...
    form_class = make_property_form(model.currency)
    form = form_class(the_usual_form_initialization)
于 2013-03-13T10:40:34.743 に答える