Skip to content

Commit 79cd97c

Browse files
pirannabckohan
andcommitted
Add a get_child_inlines() hook to inline admin classes
Co-authored-by: Jesús Leganés-Combarro 'piranna <[email protected]> Co-authored-by: Brian Kohan <[email protected]>
1 parent 94267f3 commit 79cd97c

File tree

9 files changed

+42
-13
lines changed

9 files changed

+42
-13
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,4 @@ __marimo__/
221221

222222
test1.db
223223
test2.db
224+
example/example.db

AUTHORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
* Jacob Rief
3737
* James Murty
3838
* Jedediah Smith (proxy models support)
39+
* Jesús Leganés-Combarro (Auto-discover child models and inlines, #582)
3940
* John Furr
4041
* Jonas Haag
4142
* Jonas Obrist

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Changelog
44
v4.3.0 (202X-XX-XX)
55
-------------------
66

7+
* Implemented `Include get_child_inlines() hook in stacked inline admin forms. <https://github.com/jazzband/django-polymorphic/pull/681>`_
78
* Fixed `"multi-database support in inheritance accessors. <https://github.com/jazzband/django-polymorphic/pull/550>`_
89
* Fixed `Caching in inheritance accessor functions <https://github.com/jazzband/django-polymorphic/pull/510>`_
910
* Fixed `Foreign key resolves to parent class when using abstract models <https://github.com/jazzband/django-polymorphic/issues/437>`_

justfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ manage *COMMAND:
1515
import sys
1616
from django.core import management
1717
sys.path.append(os.getcwd())
18-
os.environ["DJANGO_SETTINGS_MODULE"] = "polymorphic.tests.settings"
18+
os.environ["DJANGO_SETTINGS_MODULE"] = "polymorphic.tests.debug"
1919
os.environ["SQLITE_DATABASES"] = "test1.db,test2.db"
2020
management.execute_from_command_line(sys.argv + "{{ COMMAND }}".split(" "))
2121

src/polymorphic/admin/inlines.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,22 @@ def __init__(self, parent_model, admin_site):
7777
for child_inline in self.child_inline_instances:
7878
self._child_inlines_lookup[child_inline.model] = child_inline
7979

80+
def get_child_inlines(self):
81+
"""
82+
Return the derived inline classes which this admin should handle.
83+
84+
This should return an iterable of
85+
:class:`~polymorphic.admin.inlines.PolymorphicInlineModelAdmin.Child classes,
86+
to override :attr:`child_inlines.
87+
"""
88+
return self.child_inlines or []
89+
8090
def get_child_inline_instances(self):
8191
"""
8292
:rtype List[PolymorphicInlineModelAdmin.Child]
8393
"""
8494
instances = []
85-
for ChildInlineType in self.child_inlines:
95+
for ChildInlineType in self.get_child_inlines():
8696
instances.append(ChildInlineType(parent_inline=self))
8797
return instances
8898

src/polymorphic/tests/admin.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from inspect import isclass
12
from django.contrib.admin import register, ModelAdmin, site as admin_site
23
from polymorphic.admin import (
34
StackedPolymorphicInline,
@@ -35,20 +36,25 @@ class PlainAAdmin(ModelAdmin):
3536
search_fields = ["field1"]
3637

3738

38-
class InlineModelAChild(StackedPolymorphicInline.Child):
39+
class Inline(StackedPolymorphicInline):
3940
model = InlineModelA
4041

42+
def get_child_inlines(self):
43+
return [
44+
child
45+
for child in self.__class__.__dict__.values()
46+
if isclass(child) and issubclass(child, StackedPolymorphicInline.Child)
47+
]
4148

42-
class InlineModelBChild(StackedPolymorphicInline.Child):
43-
model = InlineModelB
44-
autocomplete_fields = ["plain_a"]
45-
49+
class InlineModelAChild(StackedPolymorphicInline.Child):
50+
model = InlineModelA
4651

47-
class Inline(StackedPolymorphicInline):
48-
model = InlineModelA
49-
child_inlines = (InlineModelAChild, InlineModelBChild)
52+
class InlineModelBChild(StackedPolymorphicInline.Child):
53+
model = InlineModelB
54+
autocomplete_fields = ["plain_a"]
5055

5156

5257
@register(InlineParent)
5358
class InlineParentAdmin(PolymorphicInlineSupportMixin, ModelAdmin):
5459
inlines = (Inline,)
60+
extra = 1

src/polymorphic/tests/debug.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .settings import *
2+
3+
DEBUG = True

src/polymorphic/tests/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
"polymorphic",
102102
"polymorphic.tests",
103103
)
104+
104105
MIDDLEWARE = (
105106
"django.middleware.common.CommonMiddleware",
106107
"django.contrib.sessions.middleware.SessionMiddleware",

src/polymorphic/tests/test_admin.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,15 @@ class Model2ChildAdmin(PolymorphicChildModelAdmin):
9393
self.admin_post_delete(Model2A, d_obj.pk)
9494
pytest.raises(Model2A.DoesNotExist, (lambda: d_obj.refresh_from_db()))
9595

96+
def test_get_child_inlines(self):
97+
from .admin import Inline
98+
99+
inline = Inline(parent_model=InlineParent, admin_site=admin.site)
100+
child_inlines = inline.get_child_inlines()
101+
self.assertEqual(len(child_inlines), 2)
102+
self.assertEqual(child_inlines[0], Inline.InlineModelAChild)
103+
self.assertEqual(child_inlines[1], Inline.InlineModelBChild)
104+
96105
def test_admin_inlines(self):
97106
"""
98107
Test the registration of inline models.
@@ -205,9 +214,6 @@ def tearDownClass(cls):
205214

206215
def setUp(self):
207216
"""Create an admin user before running tests."""
208-
self.admin_username = "admin"
209-
self.admin_password = "password"
210-
211217
self.page = self.browser.new_page()
212218
# Log in to the Django admin
213219
self.page.goto(f"{self.live_server_url}/admin/login/")

0 commit comments

Comments
 (0)