Opened 6 years ago

Closed 6 years ago

#29741 closed Cleanup/optimization (invalid)

There is no way to validate a ModelAdmin against it's inline formsets

Reported by: Kyle Agronick Owned by: nobody
Component: contrib.admin Version: 2.1
Severity: Normal Keywords: validation forms admin
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

If you wanted to do some validation that included taking data from the ModelAdmin's form and it's formsets there is currently no way to do that. If you wanted to check that the user did not duplicate values in the form and the formset you must override the entire _changeform_view method. (Over 100 lines) The form and the formset's clean() methods get called separately with no context of the overall page.

There is the save_related(request, form, formsets, change) method where you can do this kind of validation. You can add errors at this point but they will never be checked.

There should be some kind of process_related() method where you have the request, the form, and all of it's formsets in one context.

The exact problem I'm having is I have users entering a hostname record in the ModelAdmin's form and CNAME records for that hostname on the inline forms. There is no way to check that the user didn't put the same data in the main form and the formsets.

Change History (2)

comment:1 by Carlton Gibson, 6 years ago

The inline's FormSet is given the parent object instance (already updated but not saved if the parent form was valid) so can you not leverage that to validate against?

See Overriding Methods on an InlineFormSet. Can you not implement clean() accessing the parent object as self.instance?

Last edited 6 years ago by Carlton Gibson (previous) (diff)

comment:2 by Carlton Gibson, 6 years ago

Resolution: invalid
Status: newclosed

I'm going to close this, assuming you can validate as suggested. If not, please come back with more detail and we can re-open.

Note: See TracTickets for help on using tickets.
Back to Top