懒惰选择
问题描述:
我有一个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”,但不改变主要观点:我的选择需要懒惰!
答
您可以使用 “懒人” 功能:)
很不错UTIL功能!
答
尝试使用ModelChoiceField而不是简单的ChoiceField。我想你可以通过调整你的模型来达到你想要的效果。请查看docs了解更多信息。
我还想补充一点,ModelChoiceFields默认:)是lazy
答
扩大在什么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
实例,而不是一个利益串。
绝对是最好的解决方案,这应该是被接受的答案。 – 2011-02-27 16:17:22