mirror of
https://github.com/django/django.git
synced 2025-11-18 02:56:45 +00:00
Fixed #36067 -- Remove the 'DELETE?' text when the TabularInline object does not exist.
This commit is contained in:
parent
1330cb5705
commit
95ab880d27
4 changed files with 73 additions and 7 deletions
|
|
@ -460,6 +460,14 @@ class InlineAdminFormSet:
|
||||||
def total_form_count(self):
|
def total_form_count(self):
|
||||||
return self.formset.total_form_count
|
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
|
@property
|
||||||
def media(self):
|
def media(self):
|
||||||
media = self.opts.media + self.formset.media
|
media = self.opts.media + self.formset.media
|
||||||
|
|
|
||||||
|
|
@ -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 %}
|
{% 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>
|
</th>
|
||||||
{% endfor %}
|
{% 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>
|
</tr></thead>
|
||||||
|
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
@ -58,7 +58,7 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
{% 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>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 25 KiB |
|
|
@ -824,6 +824,66 @@ class TestInline(TestDataMixin, TestCase):
|
||||||
self.assertIs(parent.show_inlines, True)
|
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")
|
@override_settings(ROOT_URLCONF="admin_inlines.urls")
|
||||||
class TestInlineMedia(TestDataMixin, TestCase):
|
class TestInlineMedia(TestDataMixin, TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
@ -2213,13 +2273,11 @@ class SeleniumTests(AdminSeleniumTestCase):
|
||||||
# Click on a few delete buttons
|
# Click on a few delete buttons
|
||||||
self.selenium.find_element(
|
self.selenium.find_element(
|
||||||
By.CSS_SELECTOR,
|
By.CSS_SELECTOR,
|
||||||
"form#profilecollection_form tr.dynamic-profile_set#profile_set-1 "
|
"form#profilecollection_form tr.dynamic-profile_set#profile_set-1 " "a",
|
||||||
"td.delete a",
|
|
||||||
).click()
|
).click()
|
||||||
self.selenium.find_element(
|
self.selenium.find_element(
|
||||||
By.CSS_SELECTOR,
|
By.CSS_SELECTOR,
|
||||||
"form#profilecollection_form tr.dynamic-profile_set#profile_set-2 "
|
"form#profilecollection_form tr.dynamic-profile_set#profile_set-2 " "a",
|
||||||
"td.delete a",
|
|
||||||
).click()
|
).click()
|
||||||
# The rows are gone and the IDs have been re-sequenced
|
# The rows are gone and the IDs have been re-sequenced
|
||||||
self.assertCountSeleniumElements(
|
self.assertCountSeleniumElements(
|
||||||
|
|
@ -2480,7 +2538,7 @@ class SeleniumTests(AdminSeleniumTestCase):
|
||||||
"CREATION DATE",
|
"CREATION DATE",
|
||||||
"UPDATE DATE",
|
"UPDATE DATE",
|
||||||
"UPDATED BY",
|
"UPDATED BY",
|
||||||
"DELETE?",
|
"",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
# There are no fieldset section names rendered.
|
# There are no fieldset section names rendered.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue