Fixed #36067 -- Remove the 'DELETE?' text when the TabularInline object does not exist.

This commit is contained in:
antoliny0919 2025-01-07 17:51:37 +09:00
parent 1330cb5705
commit 95ab880d27
4 changed files with 73 additions and 7 deletions

View file

@ -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

View file

@ -23,7 +23,7 @@
{% if field.help_text %}<img src="{% static "admin/img/icon-unknown.svg" %}" class="help help-tooltip" width="10" height="10" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}">{% endif %}
</th>
{% endfor %}
<th>{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}{% translate "Delete?" %}{% endif %}</th>
<th>{% if inline_admin_formset.can_delete %}{% translate "Delete?" %}{% endif %}</th>
</tr></thead>
<tbody>
@ -58,7 +58,7 @@
{% endfor %}
{% endfor %}
{% endfor %}
<td class="delete">{% 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 %}</td>
<td class="delete">{% if inline_admin_formset.can_delete %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
</tr>
{% endfor %}
</tbody>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Before After
Before After

View file

@ -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, "<th>Delete?</th>")
response = self.client.get(self.sp_url)
self.assertNotContains(response, "<th>Delete?</th>")
def test_tabular_inline_delete_checkbox_layout(self):
response = self.client.get(self.pc_url)
self.assertContains(
response,
'<td class="delete"><input type="checkbox" name="profile_set-0-DELETE" '
'id="id_profile_set-0-DELETE"></td>',
)
response = self.client.get(self.sp_url)
self.assertContains(response, '<td class="delete"></td>')
@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.