Return a Form class for use in the admin add view. This is used by add_view and change_view.
(self, request, obj=None, change=False, **kwargs)
| 839 | return self.get_form(request, obj, fields=None) |
| 840 | |
| 841 | def get_form(self, request, obj=None, change=False, **kwargs): |
| 842 | """ |
| 843 | Return a Form class for use in the admin add view. This is used by |
| 844 | add_view and change_view. |
| 845 | """ |
| 846 | if "fields" in kwargs: |
| 847 | fields = kwargs.pop("fields") |
| 848 | else: |
| 849 | fields = flatten_fieldsets(self.get_fieldsets(request, obj)) |
| 850 | excluded = self.get_exclude(request, obj) |
| 851 | exclude = [] if excluded is None else list(excluded) |
| 852 | readonly_fields = self.get_readonly_fields(request, obj) |
| 853 | exclude.extend(readonly_fields) |
| 854 | # Exclude all fields if it's a change form and the user doesn't have |
| 855 | # the change permission. |
| 856 | if ( |
| 857 | change |
| 858 | and hasattr(request, "user") |
| 859 | and not self.has_change_permission(request, obj) |
| 860 | ): |
| 861 | exclude.extend(fields) |
| 862 | if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude: |
| 863 | # Take the custom ModelForm's Meta.exclude into account only if the |
| 864 | # ModelAdmin doesn't define its own. |
| 865 | exclude.extend(self.form._meta.exclude) |
| 866 | # if exclude is an empty list we pass None to be consistent with the |
| 867 | # default on modelform_factory |
| 868 | exclude = exclude or None |
| 869 | |
| 870 | # Remove declared form fields which are in readonly_fields. |
| 871 | new_attrs = dict.fromkeys( |
| 872 | f for f in readonly_fields if f in self.form.declared_fields |
| 873 | ) |
| 874 | form = type(self.form.__name__, (self.form,), new_attrs) |
| 875 | |
| 876 | defaults = { |
| 877 | "form": form, |
| 878 | "fields": fields, |
| 879 | "exclude": exclude, |
| 880 | "formfield_callback": partial(self.formfield_for_dbfield, request=request), |
| 881 | **kwargs, |
| 882 | } |
| 883 | |
| 884 | if defaults["fields"] is None and not modelform_defines_fields( |
| 885 | defaults["form"] |
| 886 | ): |
| 887 | defaults["fields"] = forms.ALL_FIELDS |
| 888 | |
| 889 | try: |
| 890 | return modelform_factory(self.model, **defaults) |
| 891 | except FieldError as e: |
| 892 | raise FieldError( |
| 893 | "%s. Check fields/fieldsets/exclude attributes of class %s." |
| 894 | % (e, self.__class__.__name__) |
| 895 | ) |
| 896 | |
| 897 | def get_changelist(self, request, **kwargs): |
| 898 | """ |