summaryrefslogtreecommitdiff
path: root/django/contrib/admin/options.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/contrib/admin/options.py')
-rw-r--r--django/contrib/admin/options.py19
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