23

次のような Django my_forms.py があります。

class CarSearchForm(forms.Form):  
    # lots of fields like this
    bodystyle = forms.ChoiceField(choices=bodystyle_choices())  

それぞれの選択肢は、例えば (「サルーン」、「サルーン (15 台)」) です。したがって、選択肢はこの関数によって計算されます。

def bodystyle_choices():  
    return [(bodystyle.bodystyle_name, '%s (%s cars)' %  
          (bodystyle.bodystyle_name, bodystyle.car_set.count()))  
          for bodystyle in Bodystyle.objects.all()]

私の問題は、単に my_forms.py をインポートするたびに選択関数が実行されることです。これは、Django がそのフィールドを宣言する方法によるものだと思います。つまり、クラスではなくクラス メソッドです。これは問題ありませんが、私の views.py は my_forms.py をインポートするため、どのビューが使用されているかに関係なく、すべてのリクエストで選択肢のルックアップが行われます。

ブラケットなしでchoices=bodystyle_choicesを入れるとうまくいくかもしれないと思いましたが、次のようになります。

「関数」オブジェクトは反復可能ではありません

明らかに、キャッシングを使用して、必要なビュー関数に「import my_forms」を配置することはできますが、それは主なポイントを変更しません: 私の選択は怠惰である必要があります!

4

4 に答える 4

49

「遅延」機能を使用できます:)

from django.utils.functional import lazy

class CarSearchForm(forms.Form):  
    # lots of fields like this
    bodystyle = forms.ChoiceField(choices=lazy(bodystyle_choices, tuple)())

非常に優れたユーティリティ機能です!

于 2009-05-10T11:21:16.050 に答える
18

単純な ChoiceField の代わりに ModelChoiceField を使用してみてください。モデルを少し調整することで、目的を達成できると思います。詳しくはドキュメントをご覧ください。

また、ModelChoiceFields がlazyデフォルトであることも追加します:)

于 2009-02-20T14:33:58.177 に答える
2

今すぐ使用できます(Django 1.8だと思うので):

class CarSearchForm(forms.Form):  
    # lots of fields like this
    bodystyle = forms.ChoiceField(choices=bodystyle_choices)  

括弧がないことに注意してください。引数を渡す必要がある場合は、そのフォーム用にハードコードされた特別なバージョンの関数を作成します。

于 2019-03-27T01:08:09.523 に答える
1

Baishampayan Ghose が言ったことを拡張すると、これはおそらく最も直接的なアプローチと見なされるべきです。

from django.forms import ModelChoiceField

class BodystyleChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return '%s (%s cars)' % (obj.bodystyle_name, obj.car_set.count()))

class CarSearchForm(forms.Form):  
    bodystyle = BodystyleChoiceField(queryset=Bodystyle.objects.all())

ドキュメントはこちら: https://docs.djangoproject.com/en/1.8/ref/forms/fields/#modelchoicefield

これには、文字列ではなくインスタンスでform.cleaned_data['bodystyle']あるという利点があります。Bodystyle

于 2015-04-08T14:32:53.987 に答える