diff options
author | Hasan Ramezani <hasan.r67@gmail.com> | 2021-09-16 10:34:10 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-09-21 13:12:09 +0200 |
commit | 2f0f30f973363a59c20f204f9351724fb2ce7327 (patch) | |
tree | c9ec9df9e9d8bda1364ece47159fb2ba57559d3a /tests/admin_inlines | |
parent | 1bb8200f2f900a0cb200adfb0b0e11ec6f69fdd2 (diff) | |
download | django-2f0f30f973363a59c20f204f9351724fb2ce7327.tar.gz |
Fixed #33111 -- Fixed passing object to ModelAdmin.get_inlines() when editing in admin change view.
ModelAdmin.get_inlines() should get an unmutated object when creating
formsets during POST request.
Diffstat (limited to 'tests/admin_inlines')
-rw-r--r-- | tests/admin_inlines/admin.py | 17 | ||||
-rw-r--r-- | tests/admin_inlines/models.py | 6 | ||||
-rw-r--r-- | tests/admin_inlines/tests.py | 19 |
3 files changed, 38 insertions, 4 deletions
diff --git a/tests/admin_inlines/admin.py b/tests/admin_inlines/admin.py index c444526241..116556db7e 100644 --- a/tests/admin_inlines/admin.py +++ b/tests/admin_inlines/admin.py @@ -11,8 +11,9 @@ from .models import ( Inner4Tabular, Inner5Stacked, Inner5Tabular, NonAutoPKBook, NonAutoPKBookChild, Novel, NovelReadonlyChapter, OutfitItem, ParentModelWithCustomPk, Person, Poll, Profile, ProfileCollection, - Question, ReadOnlyInline, ShoppingWeakness, Sighting, SomeChildModel, - SomeParentModel, SottoCapo, Teacher, Title, TitleCollection, + Question, ReadOnlyInline, ShoppingWeakness, ShowInlineChild, + ShowInlineParent, Sighting, SomeChildModel, SomeParentModel, SottoCapo, + Teacher, Title, TitleCollection, ) site = admin.AdminSite(name="admin") @@ -371,6 +372,17 @@ class ChildHiddenFieldOnSingleLineStackedInline(admin.StackedInline): fields = ('name', 'position') +class ShowInlineChildInline(admin.StackedInline): + model = ShowInlineChild + + +class ShowInlineParentAdmin(admin.ModelAdmin): + def get_inlines(self, request, obj): + if obj is not None and obj.show_inlines: + return [ShowInlineChildInline] + return [] + + site.register(TitleCollection, inlines=[TitleInline]) # Test bug #12561 and #12778 # only ModelAdmin media @@ -402,6 +414,7 @@ site.register(Course, ClassAdminStackedHorizontal) site.register(CourseProxy, ClassAdminStackedVertical) site.register(CourseProxy1, ClassAdminTabularVertical) site.register(CourseProxy2, ClassAdminTabularHorizontal) +site.register(ShowInlineParent, ShowInlineParentAdmin) # Used to test hidden fields in tabular and stacked inlines. site2 = admin.AdminSite(name='tabular_inline_hidden_field_admin') site2.register(SomeParentModel, inlines=[ChildHiddenFieldTabularInline]) diff --git a/tests/admin_inlines/models.py b/tests/admin_inlines/models.py index 900eb34fca..6125e06c28 100644 --- a/tests/admin_inlines/models.py +++ b/tests/admin_inlines/models.py @@ -327,6 +327,12 @@ class CourseProxy2(Course): # Other models +class ShowInlineParent(models.Model): + show_inlines = models.BooleanField(default=False) + + +class ShowInlineChild(models.Model): + parent = models.ForeignKey(ShowInlineParent, on_delete=models.CASCADE) class ProfileCollection(models.Model): diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py index c50ad8cf1d..1c8d6bd271 100644 --- a/tests/admin_inlines/tests.py +++ b/tests/admin_inlines/tests.py @@ -12,8 +12,8 @@ from .models import ( ChildModel1, ChildModel2, Fashionista, FootNote, Holder, Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked, Inner4Tabular, Novel, OutfitItem, Parent, ParentModelWithCustomPk, Person, Poll, Profile, - ProfileCollection, Question, Sighting, SomeChildModel, SomeParentModel, - Teacher, VerboseNamePluralProfile, VerboseNameProfile, + ProfileCollection, Question, ShowInlineParent, Sighting, SomeChildModel, + SomeParentModel, Teacher, VerboseNamePluralProfile, VerboseNameProfile, ) INLINE_CHANGELINK_HTML = 'class="inlinechangelink">Change</a>' @@ -618,6 +618,21 @@ class TestInline(TestDataMixin, TestCase): self.assertContains(response, '<h2>Author</h2>', html=True) # Tabular. self.assertContains(response, '<h2>Fashionista</h2>', html=True) # Stacked. + def test_inlines_based_on_model_state(self): + parent = ShowInlineParent.objects.create(show_inlines=False) + data = { + 'show_inlines': 'on', + '_save': 'Save', + } + change_url = reverse( + 'admin:admin_inlines_showinlineparent_change', + args=(parent.id,), + ) + response = self.client.post(change_url, data) + self.assertEqual(response.status_code, 302) + parent.refresh_from_db() + self.assertIs(parent.show_inlines, True) + @override_settings(ROOT_URLCONF='admin_inlines.urls') class TestInlineMedia(TestDataMixin, TestCase): |