Helper function to generate formsets for add/change_view.
(self, request, obj, change)
| 2629 | return formset_params |
| 2630 | |
| 2631 | def _create_formsets(self, request, obj, change): |
| 2632 | "Helper function to generate formsets for add/change_view." |
| 2633 | formsets = [] |
| 2634 | inline_instances = [] |
| 2635 | prefixes = {} |
| 2636 | get_formsets_args = [request] |
| 2637 | if change: |
| 2638 | get_formsets_args.append(obj) |
| 2639 | for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args): |
| 2640 | prefix = FormSet.get_default_prefix() |
| 2641 | prefixes[prefix] = prefixes.get(prefix, 0) + 1 |
| 2642 | if prefixes[prefix] != 1 or not prefix: |
| 2643 | prefix = "%s-%s" % (prefix, prefixes[prefix]) |
| 2644 | formset_params = self.get_formset_kwargs(request, obj, inline, prefix) |
| 2645 | formset = FormSet(**formset_params) |
| 2646 | |
| 2647 | def user_deleted_form(request, obj, formset, index, inline): |
| 2648 | """Return whether or not the user deleted the form.""" |
| 2649 | return ( |
| 2650 | inline.has_delete_permission(request, obj) |
| 2651 | and "{}-{}-DELETE".format(formset.prefix, index) in request.POST |
| 2652 | ) |
| 2653 | |
| 2654 | # Bypass validation of each view-only inline form (since the form's |
| 2655 | # data won't be in request.POST), unless the form was deleted. |
| 2656 | if not inline.has_change_permission(request, obj if change else None): |
| 2657 | for index, form in enumerate(formset.initial_forms): |
| 2658 | if user_deleted_form(request, obj, formset, index, inline): |
| 2659 | continue |
| 2660 | form._errors = {} |
| 2661 | form.cleaned_data = form.initial |
| 2662 | formsets.append(formset) |
| 2663 | inline_instances.append(inline) |
| 2664 | return formsets, inline_instances |
| 2665 | |
| 2666 | |
| 2667 | class InlineModelAdmin(BaseModelAdmin): |
no test coverage detected