只需要编写一些代码并在底部进行解释。
# modelforms.py
#
class MyModelModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(MyModelModelForm, self).__init__(*args, **kwargs)
print '__init__'
class Meta:
model = MyModel
exclude = ('my_fk', )
我在这里使用的是django-vanilla-views
# views.py
#
class MyCreateView(NoAdminNoStaffLoginRequiredMixin, HasPermissionsMixin, CreateView):
template_name = 'modelform_create.html'
form_class = MyOtherModelModelForm # this modelform isn't important
required_permission = 'create_model'
def get_success_url(self):
return reverse_lazy('mymodel_detail', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs):
context = super(MyCreateView, self).get_context_data(**kwargs)
# FIXME: form's __init__ being called a lot
MyModelFormset = modelformset_factory(
MyModel, form=MyModelModelForm, extra=4, max_num=10, validate_max=True)
if self.request.POST:
formset = MyModelFormset(
self.request.POST,
queryset=MyModel.objects.none(),
form_kwargs={'request': self.request})
else:
formset = MyModelFormset(
queryset=MyModel.objects.none(),
form_kwargs={'request': self.request})
print formset.total_form_count() # 4, which makes sense
context['formset'] = formset
return context
MyModelModelForm __init__
被调用18次。是的,我想知道我是否可以通过不发生来解决这个问题。
我不希望多次调用它的原因是我在数据库中查询forms.ChoiceField(choices=...)
,它会不必要地多次查询数据库。或者,如果有一个更好的位置来填充选择(注意:我不能只在声明字段的同一空间中执行它。)这是一个填充此特定字段的mixin。
如果需要更多信息,请告诉我。我不得不减少相关信息的代码。