首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django形式的惰性选择

Django形式的惰性选择
EN

Stack Overflow用户
提问于 2019-03-27 00:21:42
回答 2查看 0关注 0票数 0

我有一个像这样的Django my_forms.py:

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

每种选择都是例如(“Saloon”,“Saloon(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'对象不可迭代

显然我可以使用缓存并将“import my_forms”放在所需的视图函数中,但这并没有改变主要观点:我的选择需要是惰性的!

EN

回答 2

Stack Overflow用户

发布于 2019-03-27 08:54:27

扩展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实例而不是字符串。

票数 0
EN

Stack Overflow用户

发布于 2019-03-27 09:50:00

你可以使用“惰性”功能:)

from django.utils.functional import lazy

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

非常好的util函数!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档