jnn*_*nns 8 django django-forms django-database
我正在为我的Django应用程序构建一个csv导入表单,并希望在ModelFormSet出于验证目的显示要导入的行.
因此我添加了一个相关的视图,ModelAdmin它从csv中读取行并打印出一个ModelFormSet(queryset=an_empty_queryset, initial={data_from_the_csv}).
问题是模型通过ForeignKey字段引用其他三个模型,并且对于formset 中每个表单中的每个字段,都会发出数据库查询以填充ModelChoiceField选项.
为什么Django不缓存表单(因为它被多次使用)或者是否已经有办法实现这个我还不知道呢?
Mic*_*nor 14
Django formsets只是将表单创建的所有细节委托给表单对象本身,并且各个表单实例不了解其他表单实例,因此每个表单实例都必须查询自己的选择并不出乎意料.
缓存也可能产生意想不到的副作用 - 例如,表单的__init__功能可能取决于initial它收到的数据,使缓存的form对象不正确.
减少查询数量的最佳方法是检索选择查询集一次,然后将它们传递给构造函数中的表单类.这将需要定义自定义ModelForm和自定义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
Run Code Online (Sandbox Code Playgroud)
并且您的formset需要覆盖一个方法来运行查询集,并在构造它们时将它们传递给表单:
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))
Run Code Online (Sandbox Code Playgroud)
(请参阅Django源代码以了解这将如何工作)
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |