django-nested-inline
django-nested-inline copied to clipboard
Error in nested inline not bubbling up
I am using django-nested-inline with a model defined like this:
Person
└─ House
└─Room
My Admin is defined in this way:
from nested_inline.admin import NestedStackedInline, NestedModelAdmin
class RoomInlineStacked(NestedStackedInline):
...
class HouseInline(NestedStackedInline):
inlines = [RoomInlineStacked]
class PersonAdmin(NestedModelAdmin):
inlines = [HouseInline]
The form displays correctly, and works fine, until there is an error in the RoomInlineStacked. In which case, the error is only displayed within the inline formset, but not at the top level (where errors are normally shown)
Errors within HouseInline are reported correctly at the top of the page. I'm expecting this to happen for the RoomInlineStacked as well. aka I'm expecting to see this (which doesn't happen at the moment):

I am trying to understand what's missing within AdminErrorList in https://github.com/s-block/django-nested-inline/blob/master/nested_inline/admin.py#L264 but I'm struggling to navigate the structure of formsets/forms/inlines and other attributes to find the error from the underlying NestedStackedInline and send it back up to the NestedModelAdmin.
Any pointers appreciated
I am facing the same issue.
The problem is that helpers.AdminErrorList isn't builded to catch recursively errors (at arbitrary level) and it is not called with recursive formsets.
Since all_valid_with_nesting is walking recursively formsets, I suggest to backstep the error at this step.
My fix occurs in some private code but I simply redefined def all_valid_with_nesting in a subclass of NestedModelAdmin and added
for form in formset:
if hasattr(form, 'nested_formsets'):
+ if not self.all_valid_with_nesting(form.nested_formsets):
+ # backstep error
+ form.errors[None] = [
+ f.errors + f.non_form_errors()
+ for f in form.nested_formsets
+ ]
return False