MCPcopy
hub / github.com/django/django / add_fields

Method add_fields

django/forms/models.py:989–1037  ·  view source on GitHub ↗

Add a hidden field for the object's primary key.

(self, form, index)

Source from the content-addressed store, hash-verified

987 return self.new_objects
988
989 def add_fields(self, form, index):
990 """Add a hidden field for the object's primary key."""
991 from django.db.models import AutoField, ForeignKey, OneToOneField
992
993 self._pk_field = pk = self.model._meta.pk
994 # If a pk isn't editable, then it won't be on the form, so we need to
995 # add it here so we can tell which object is which when we get the
996 # data back. Generally, pk.editable should be false, but for some
997 # reason, auto_created pk fields and AutoField's editable attribute is
998 # True, so check for that as well.
999
1000 def pk_is_not_editable(pk):
1001 return (
1002 (not pk.editable)
1003 or (pk.auto_created or isinstance(pk, AutoField))
1004 or (
1005 pk.remote_field
1006 and pk.remote_field.parent_link
1007 and pk_is_not_editable(pk.remote_field.model._meta.pk)
1008 )
1009 )
1010
1011 if pk_is_not_editable(pk) or pk.name not in form.fields:
1012 if form.is_bound:
1013 # If we're adding the related instance, ignore its primary key
1014 # as it could be an auto-generated default which isn't actually
1015 # in the database.
1016 pk_value = None if form.instance._state.adding else form.instance.pk
1017 else:
1018 try:
1019 if index is not None:
1020 pk_value = self.get_queryset()[index].pk
1021 else:
1022 pk_value = None
1023 except IndexError:
1024 pk_value = None
1025 if isinstance(pk, (ForeignKey, OneToOneField)):
1026 qs = pk.remote_field.model._default_manager.get_queryset()
1027 else:
1028 qs = self.model._default_manager.get_queryset()
1029 qs = qs.using(form.instance._state.db)
1030 if form._meta.widgets:
1031 widget = form._meta.widgets.get(self._pk_field.name, HiddenInput)
1032 else:
1033 widget = HiddenInput
1034 form.fields[self._pk_field.name] = ModelChoiceField(
1035 qs, initial=pk_value, required=False, widget=widget
1036 )
1037 super().add_fields(form, index)
1038
1039
1040def modelformset_factory(

Callers 1

add_fieldsMethod · 0.45

Calls 4

get_querysetMethod · 0.95
ModelChoiceFieldClass · 0.85
usingMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected