Я пытаюсь создать вложенный встроенный набор форм, причем внутренняя
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