Django 表单集只是将表单创建的所有细节委托给表单对象本身,并且各个表单实例不知道其他表单实例,因此每个实例都必须查询自己的选择也就不足为奇了。
缓存也可能有意想不到的副作用——例如,表单的__init__
功能可能依赖于initial
它接收到的数据,从而使缓存的form
对象不正确。
减少查询数量的最佳方法是检索一次选择查询集,然后将它们传递给它们的构造函数中的表单类。这将需要定义一个 customModelForm
和一个 custom ModelFormSet
。
您的表单将需要一个直接接受选择的构造函数:
from django.forms.models import ModelForm
class MyForm(ModelForm):
def __init__(self, my_field_choices=None, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['my_field'].choices = my_field_choices
并且您的表单集将需要覆盖一个方法来运行查询集并将它们传递到构造它们的表单中:
from django.forms.models import BaseModelFormSet
class MyFormSet(BaseModelFormSet):
def _construct_forms(self):
# instantiate all the forms and put them in self.forms
self.forms = []
# Define each of your choices querysets
my_field_choices = Model.object.filter(...)
#Add your querysets to a dict to pass to the form
form_defaults = {'my_field_choices': my_field_choices, }
for i in xrange(min(self.total_form_count(), self.absolute_max)):
self.forms.append(self._construct_form(i, **form_defaults))
(请参阅Django 源代码以了解其工作原理)