ModelForm __init__被称为荒谬的次数

时间:2018-02-14 19:07:09

标签: python django django-views modelform

只需要编写一些代码并在底部进行解释。

# 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。

如果需要更多信息,请告诉我。我不得不减少相关信息的代码。

0 个答案:

没有答案