Вложенный polymorphic_inline_formsets дает AttributeError: у объекта 'NoneType' нет атрибута 'get_real_instance_class' - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь создать вложенный встроенный набор форм, причем внутренняя inline formset из django-polymorphic.

Это мой полиморфный встроенный набор форм:

Oformset = polymorphic_inlineformset_factory(
    MBF,
    MO,
    formset_children=(
        PolymorphicFormSetChild(LO),
        PolymorphicFormSetChild(DO),
        PolymorphicFormSetChild(BO),
        PolymorphicFormSetChild(AO),
    ),
    fields='__all__',
    can_delete=False,
    extra=0)

Я создал обычный baseinlineformset и добавил к нему Oformse (polymorphic_inlineformset).

Я получаю эту ошибку для form.nested в is_valid():

  model = defaults['instance'].get_real_instance_class()
AttributeError: 'NoneType' object has no attribute 'get_real_instance_class'

В этом контексте form.nested - это None, когда он должен был дать PolymorphicFormSetChild из Oformset, который был создан.

class MyBaseFormset(BaseInlineFormSet):
    def add_fields(self, form, index):
        super(BaseScenarioFormset, self).add_fields(form, index)
        form.nested = Oformset(
            instance=form.instance,
            data=form.data if form.is_bound else None,
            files=form.files if form.is_bound else None,
            prefix='modelobject-%s-%s' % (form.prefix, Oformset.get_default_prefix()))

    def is_valid(self):
        result = super(BaseScenarioFormset, self).is_valid()     
        if self.is_bound:
            for form in self.forms:
                result=result and form.nested.is_valid()
        return result

    def save(self, commit=True):
        result = super(BaseScenarioFormset, self).save(commit=commit)
        for form in self:
            form.nested.save(commit=commit)
        return result

Formset, который будет содержать polyinlineformset:

ModelBasicFormSet = inlineformset_factory(
    UCP,
    MBF,
    fields=['modelNum','interactor', 'action', 'validationStep'],
    formset=MyBaseFormset,
    can_delete=False,
    extra=0)

UpdateView для отображения вложенной встроенной полиморфной формы:

class ModelUCUpdateView(UpdateView):
    def get_context_data(self, **kwargs):
        context = super(ModelUCUpdateView, self).get_context_data(**kwargs)
        if self.request.POST:
            context['modelbasicflow_form'] = ModelBasicFlowFormSet(
                self.request.POST,
                self.request.FILES,
                instance=self.object,
                queryset=ModelBasicFlow.objects.all(),
                prefix='modelbasicflow')
        else:
            context['modelbasicflow_form'] = ModelBasicFlowFormSet(
                instance=self.object,
                queryset=ModelBasicFlow.objects.filter(useCase=self.object),
                prefix='modelbasicflow')        
        return context
...