diff options
Diffstat (limited to 'django/contrib/admin/options.py')
| -rw-r--r-- | django/contrib/admin/options.py | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index d0948359ab..ddaf130584 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -1948,7 +1948,24 @@ class ModelAdmin(BaseModelAdmin): 'files': request.FILES, 'save_as_new': '_saveasnew' in request.POST }) - formsets.append(FormSet(**formset_params)) + formset = FormSet(**formset_params) + + def user_deleted_form(request, obj, formset, index): + """Return whether or not the user deleted the form.""" + return ( + inline.has_delete_permission(request, obj) and + '{}-{}-DELETE'.format(formset.prefix, index) in request.POST + ) + + # Bypass validation of each view-only inline form (since the form's + # data won't be in request.POST), unless the form was deleted. + if not inline.has_change_permission(request, obj): + for index, form in enumerate(formset.initial_forms): + if user_deleted_form(request, obj, formset, index): + continue + form._errors = {} + form.cleaned_data = form.initial + formsets.append(formset) inline_instances.append(inline) return formsets, inline_instances |
