Django formsets는 양식 작성의 모든 세부 사항을 양식 오브젝트 자체에 위임하기 만하고 개별 양식 인스턴스는 다른 양식 인스턴스를 인식하지 않으므로 각 양식 인스턴스는 자체 선택 사항에 대해 조회해야합니다. 함수가받은 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
그리고 그들이 구축하고로의 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))
(이 어떻게 작동하는지에보고 the Django source 참조)
django1.5 모델 메모리 캐시를 가지고있다. – danihp
맞습니다 (https://docs.djangoproject.com/en/1.5/releases/1.5/#caching-of-related-model-instances).하지만 불행히도이 문제에는 영향을 미치지 않습니다. – jnns
이 문제를 해결하기 위해 약간의 해킹을했습니다. http://stackoverflow.com/a/43105646/8450 –