次のような 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」を配置することはできますが、それは主なポイントを変更しません: 私の選択は怠惰である必要があります!