From 95ab880d27981c4e0230f0d1e4d8fcbff1968341 Mon Sep 17 00:00:00 2001 From: antoliny0919 Date: Tue, 7 Jan 2025 17:51:37 +0900 Subject: [PATCH] Fixed #36067 -- Remove the 'DELETE?' text when the TabularInline object does not exist. --- django/contrib/admin/helpers.py | 8 +++ .../templates/admin/edit_inline/tabular.html | 4 +- docs/intro/_images/admin11t.png | Bin 6467 -> 25492 bytes tests/admin_inlines/tests.py | 68 ++++++++++++++++-- 4 files changed, 73 insertions(+), 7 deletions(-) diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py index 51450d1d9e..3e33855394 100644 --- a/django/contrib/admin/helpers.py +++ b/django/contrib/admin/helpers.py @@ -460,6 +460,14 @@ class InlineAdminFormSet: def total_form_count(self): return self.formset.total_form_count + @property + def can_delete(self): + return ( + self.formset.can_delete + and self.has_delete_permission + and any(inlineadminform.original is not None for inlineadminform in self) + ) + @property def media(self): media = self.opts.media + self.formset.media diff --git a/django/contrib/admin/templates/admin/edit_inline/tabular.html b/django/contrib/admin/templates/admin/edit_inline/tabular.html index 9367ac9b63..1151603f7e 100644 --- a/django/contrib/admin/templates/admin/edit_inline/tabular.html +++ b/django/contrib/admin/templates/admin/edit_inline/tabular.html @@ -23,7 +23,7 @@ {% if field.help_text %}({{ field.help_text|striptags }}){% endif %} {% endfor %} - {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}{% translate "Delete?" %}{% endif %} + {% if inline_admin_formset.can_delete %}{% translate "Delete?" %}{% endif %} @@ -58,7 +58,7 @@ {% endfor %} {% endfor %} {% endfor %} - {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %} + {% if inline_admin_formset.can_delete %}{{ inline_admin_form.deletion_field.field }}{% endif %} {% endfor %} diff --git a/docs/intro/_images/admin11t.png b/docs/intro/_images/admin11t.png index 2dda5c0d05708dcf333b812a9977b55c9b49537a..a5b444f12845211342fd9f34f907f72e27df4c02 100644 GIT binary patch literal 25492 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 VxACc|6x=kERZ-B8FOfA5_&-Hjp!NU& literal 6467 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 E0ljyxA^-pY diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py index 89f43300d7..9173720d4a 100644 --- a/tests/admin_inlines/tests.py +++ b/tests/admin_inlines/tests.py @@ -824,6 +824,66 @@ class TestInline(TestDataMixin, TestCase): self.assertIs(parent.show_inlines, True) +@override_settings(ROOT_URLCONF="admin_inlines.urls") +class TestInlineCanDelete(TestCase): + @classmethod + def setUpTestData(cls): + cls.user = User.objects.create_user( + username="tester", + password="password", + is_staff=True, + ) + # can_delete True case + pc_permission = Permission.objects.filter( + content_type=ContentType.objects.get_for_model(ProfileCollection) + ) + p_permission = Permission.objects.filter( + codename__in=["view_profile", "delete_profile"], + content_type=ContentType.objects.get_for_model(Profile), + ) + pc = ProfileCollection.objects.create() + Profile.objects.create(collection=pc, first_name="SiHyun", last_name="Lee") + # can_delete False case + sp_permission = Permission.objects.filter( + content_type=ContentType.objects.get_for_model(SomeParentModel) + ) + sc_permission = Permission.objects.filter( + codename__in=["view_somechildmodel"], + content_type=ContentType.objects.get_for_model(SomeChildModel), + ) + sp = SomeParentModel.objects.create(name="p") + SomeChildModel.objects.create(name="c", position="0", parent=sp) + cls.user.user_permissions.add( + *pc_permission, *p_permission, *sp_permission, *sc_permission + ) + + cls.pc_url = reverse( + "admin:admin_inlines_profilecollection_change", args=(pc.pk,) + ) + cls.sp_url = reverse( + "admin:admin_inlines_someparentmodel_change", args=(sp.pk,) + ) + + def setUp(self): + self.client.force_login(self.user) + + def test_tabular_inline_delete_field(self): + response = self.client.get(self.pc_url) + self.assertContains(response, "Delete?") + response = self.client.get(self.sp_url) + self.assertNotContains(response, "Delete?") + + def test_tabular_inline_delete_checkbox_layout(self): + response = self.client.get(self.pc_url) + self.assertContains( + response, + '', + ) + response = self.client.get(self.sp_url) + self.assertContains(response, '') + + @override_settings(ROOT_URLCONF="admin_inlines.urls") class TestInlineMedia(TestDataMixin, TestCase): def setUp(self): @@ -2213,13 +2273,11 @@ class SeleniumTests(AdminSeleniumTestCase): # Click on a few delete buttons self.selenium.find_element( By.CSS_SELECTOR, - "form#profilecollection_form tr.dynamic-profile_set#profile_set-1 " - "td.delete a", + "form#profilecollection_form tr.dynamic-profile_set#profile_set-1 " "a", ).click() self.selenium.find_element( By.CSS_SELECTOR, - "form#profilecollection_form tr.dynamic-profile_set#profile_set-2 " - "td.delete a", + "form#profilecollection_form tr.dynamic-profile_set#profile_set-2 " "a", ).click() # The rows are gone and the IDs have been re-sequenced self.assertCountSeleniumElements( @@ -2480,7 +2538,7 @@ class SeleniumTests(AdminSeleniumTestCase): "CREATION DATE", "UPDATE DATE", "UPDATED BY", - "DELETE?", + "", ], ) # There are no fieldset section names rendered.