MCPcopy
hub / github.com/django/django / get_form

Method get_form

django/contrib/admin/options.py:841–895  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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 """

Callers 5

_changeform_viewMethod · 0.95
test_default_fieldsMethod · 0.95
response_addMethod · 0.45

Calls 11

flatten_fieldsetsFunction · 0.90
modelform_defines_fieldsFunction · 0.90
modelform_factoryFunction · 0.90
FieldErrorClass · 0.90
extendMethod · 0.80
fromkeysMethod · 0.80
popMethod · 0.45
get_fieldsetsMethod · 0.45
get_excludeMethod · 0.45
get_readonly_fieldsMethod · 0.45
has_change_permissionMethod · 0.45

Tested by 2

test_default_fieldsMethod · 0.76