Skip to content

Commit 927d9b5

Browse files
czpythontimgraham
authored andcommitted
[1.11.x] Fixed #27967 -- Fixed KeyError in admin's inline form with inherited non-editable pk.
Thanks Robin Anupol for the initial report and workaround. Backport of 9dc83c3 from master
1 parent 7fb148a commit 927d9b5

File tree

5 files changed

+34
-6
lines changed

5 files changed

+34
-6
lines changed

django/contrib/admin/helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ def needs_explicit_pk_field(self):
355355
# Also search any parents for an auto field. (The pk info is propagated to child
356356
# models so that does not need to be checked in parents.)
357357
for parent in self.form._meta.model._meta.get_parent_list():
358-
if parent._meta.auto_field:
358+
if parent._meta.auto_field or not parent._meta.model._meta.pk.editable:
359359
return True
360360
return False
361361

docs/releases/1.11.3.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,6 @@ Bugfixes
2626

2727
* Fixed model initialization to set the name of class-based model indexes
2828
for models that only inherit ``models.Model`` (:ticket:`28282`).
29+
30+
* Fixed crash in admin's inlines when a model has an inherited non-editable
31+
primary key (:ticket:`27967`).

tests/admin_inlines/admin.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
Author, BinaryTree, CapoFamiglia, Chapter, ChildModel1, ChildModel2,
66
Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, Holder,
77
Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked,
8-
Inner4Tabular, NonAutoPKBook, Novel, ParentModelWithCustomPk, Poll,
9-
Profile, ProfileCollection, Question, ReadOnlyInline, ShoppingWeakness,
10-
Sighting, SomeChildModel, SomeParentModel, SottoCapo, Title,
11-
TitleCollection,
8+
Inner4Tabular, NonAutoPKBook, NonAutoPKBookChild, Novel,
9+
ParentModelWithCustomPk, Poll, Profile, ProfileCollection, Question,
10+
ReadOnlyInline, ShoppingWeakness, Sighting, SomeChildModel,
11+
SomeParentModel, SottoCapo, Title, TitleCollection,
1212
)
1313

1414
site = admin.AdminSite(name="admin")
@@ -23,6 +23,11 @@ class NonAutoPKBookTabularInline(admin.TabularInline):
2323
classes = ('collapse',)
2424

2525

26+
class NonAutoPKBookChildTabularInline(admin.TabularInline):
27+
model = NonAutoPKBookChild
28+
classes = ('collapse',)
29+
30+
2631
class NonAutoPKBookStackedInline(admin.StackedInline):
2732
model = NonAutoPKBook
2833
classes = ('collapse',)
@@ -40,6 +45,7 @@ class AuthorAdmin(admin.ModelAdmin):
4045
inlines = [
4146
BookInline, NonAutoPKBookTabularInline, NonAutoPKBookStackedInline,
4247
EditablePKBookTabularInline, EditablePKBookStackedInline,
48+
NonAutoPKBookChildTabularInline,
4349
]
4450

4551

tests/admin_inlines/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ def save(self, *args, **kwargs):
6363
super(NonAutoPKBook, self).save(*args, **kwargs)
6464

6565

66+
class NonAutoPKBookChild(NonAutoPKBook):
67+
pass
68+
69+
6670
class EditablePKBook(models.Model):
6771
manual_pk = models.IntegerField(primary_key=True)
6872
author = models.ForeignKey(Author, models.CASCADE)

tests/admin_inlines/tests.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,21 @@ def test_inline_nonauto_noneditable_pk(self):
357357
html=True
358358
)
359359

360+
def test_inline_nonauto_noneditable_inherited_pk(self):
361+
response = self.client.get(reverse('admin:admin_inlines_author_add'))
362+
self.assertContains(
363+
response,
364+
'<input id="id_nonautopkbookchild_set-0-nonautopkbook_ptr" '
365+
'name="nonautopkbookchild_set-0-nonautopkbook_ptr" type="hidden" />',
366+
html=True
367+
)
368+
self.assertContains(
369+
response,
370+
'<input id="id_nonautopkbookchild_set-2-nonautopkbook_ptr" '
371+
'name="nonautopkbookchild_set-2-nonautopkbook_ptr" type="hidden" />',
372+
html=True
373+
)
374+
360375
def test_inline_editable_pk(self):
361376
response = self.client.get(reverse('admin:admin_inlines_author_add'))
362377
self.assertContains(
@@ -888,7 +903,7 @@ def test_collapsed_inlines(self):
888903
# One field is in a stacked inline, other in a tabular one.
889904
test_fields = ['#id_nonautopkbook_set-0-title', '#id_nonautopkbook_set-2-0-title']
890905
show_links = self.selenium.find_elements_by_link_text('SHOW')
891-
self.assertEqual(len(show_links), 2)
906+
self.assertEqual(len(show_links), 3)
892907
for show_index, field_name in enumerate(test_fields, 0):
893908
self.wait_until_invisible(field_name)
894909
show_links[show_index].click()

0 commit comments

Comments
 (0)