Add a hidden field for the object's primary key.
(self, form, index)
| 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 | |
| 1040 | def modelformset_factory( |
no test coverage detected