2009-02-20 156 views
19

我有一個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,因此無論使用哪個視圖,都會對每個請求執行選擇查找。

我想,也許把選擇= bodystyle_choices沒有支架會的工作,但我得到:

'function' object is not iterable

很顯然,我可以使用緩存,並把剛剛在所需的視圖功能的「進口my_forms」,但不改變主要觀點:我的選擇需要懶惰!

回答

43

您可以使用 「懶人」 功能:)

​​

很不錯UTIL功能!

+1

絕對是最好的解決方案,這應該是被接受的答案。 – 2011-02-27 16:17:22

18

嘗試使用ModelChoiceField而不是簡單的ChoiceField。我想你可以通過調整你的模型來達到你想要的效果。請查看docs瞭解更多信息。

我還想補充一點,ModelChoiceFields默認:)是lazy

0

擴大在什麼Baishampayan戈塞說,這或許應該被認爲是最直接的方法:

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實例,而不是一個利益串。