2009-02-20 116 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实例,而不是一个利益串。