diff options
| author | antoliny0919 <antoliny0919@gmail.com> | 2025-04-17 19:38:26 +0900 |
|---|---|---|
| committer | Natalia <124304+nessita@users.noreply.github.com> | 2025-04-22 22:14:54 -0300 |
| commit | 97c93549fc864af61cb1ae1fd171a3c7ac6ee89a (patch) | |
| tree | 718a4c2841dfd1d2e5de4f3ee46e5f48ee82f90d | |
| parent | adf2991d32c24f8b2e549a25a7eda52f317a91a6 (diff) | |
[5.2.x] Fixed #36331 -- Reverted "Fixed #36055 -- Prevented overlap of object-tools buttons and page header in the admin."
This reverts commits b1324a680add78de24c763911d0eefa19b9263bc and
02a5cbfe76382da2a0414df17017185be5bd47f9. The former caused a regression
in admin sites that relied on the `object-tools` block being inside the
`content` block.
Thank you to Fabian Braun for the report.
Backport of 1bc805e23b73a580b82a1d416ab0fb59a1073047 from main.
| -rw-r--r-- | django/contrib/admin/static/admin/css/base.css | 5 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/responsive.css | 4 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/base.html | 2 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_form.html | 3 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_list.html | 15 | ||||
| -rw-r--r-- | docs/releases/5.2.1.txt | 4 | ||||
| -rw-r--r-- | tests/admin_views/tests.py | 19 |
7 files changed, 14 insertions, 38 deletions
diff --git a/django/contrib/admin/static/admin/css/base.css b/django/contrib/admin/static/admin/css/base.css index 4f4773284e..37910431a0 100644 --- a/django/contrib/admin/static/admin/css/base.css +++ b/django/contrib/admin/static/admin/css/base.css @@ -773,6 +773,7 @@ a.deletelink:focus, a.deletelink:hover { padding-left: 0; float: right; position: relative; + margin-top: -48px; } .object-tools li { @@ -820,10 +821,6 @@ a.deletelink:focus, a.deletelink:hover { background-image: url(../img/tooltag-add.svg); } -.object-tools:has(a.addlink) { - margin-top: -48px; -} - /* OBJECT HISTORY */ #change-history table { diff --git a/django/contrib/admin/static/admin/css/responsive.css b/django/contrib/admin/static/admin/css/responsive.css index 0ca125df68..f0fcade41c 100644 --- a/django/contrib/admin/static/admin/css/responsive.css +++ b/django/contrib/admin/static/admin/css/responsive.css @@ -465,10 +465,6 @@ input[type="submit"], button { margin-left: 15px; } - .object-tools:has(a.addlink) { - margin-top: 0px; - } - /* Forms */ .form-row { diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html index 7e95550cf2..dd02328e46 100644 --- a/django/contrib/admin/templates/admin/base.html +++ b/django/contrib/admin/templates/admin/base.html @@ -99,9 +99,9 @@ <div id="content" class="{% block coltype %}colM{% endblock %}"> {% block pretitle %}{% endblock %} {% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %} - {% block object-tools %}{% endblock %} {% block content_subtitle %}{% if subtitle %}<h2>{{ subtitle }}</h2>{% endif %}{% endblock %} {% block content %} + {% block object-tools %}{% endblock %} {{ content }} {% endblock %} {% block sidebar %}{% endblock %} diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index 11536b0965..8e7ced9a48 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -24,6 +24,7 @@ {% endblock %} {% endif %} +{% block content %}<div id="content-main"> {% block object-tools %} {% if change and not is_popup %} <ul class="object-tools"> @@ -33,8 +34,6 @@ </ul> {% endif %} {% endblock %} - -{% block content %}<div id="content-main"> <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}{% if form_url %}action="{{ form_url }}" {% endif %}method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %} <div> {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %} diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html index cf96df9fe2..b0b4c31619 100644 --- a/django/contrib/admin/templates/admin/change_list.html +++ b/django/contrib/admin/templates/admin/change_list.html @@ -39,16 +39,15 @@ {% block coltype %}{% endblock %} -{% block object-tools %} -<ul class="object-tools"> - {% block object-tools-items %} - {% change_list_object_tools %} - {% endblock %} -</ul> -{% endblock %} - {% block content %} <div id="content-main"> + {% block object-tools %} + <ul class="object-tools"> + {% block object-tools-items %} + {% change_list_object_tools %} + {% endblock %} + </ul> + {% endblock %} {% if cl.formset and cl.formset.errors %} <p class="errornote"> {% blocktranslate count counter=cl.formset.total_error_count %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} diff --git a/docs/releases/5.2.1.txt b/docs/releases/5.2.1.txt index 81fb750847..caebde7f02 100644 --- a/docs/releases/5.2.1.txt +++ b/docs/releases/5.2.1.txt @@ -40,3 +40,7 @@ Bugfixes * Fixed a regression in Django 5.2 where the password validation error message from ``MinimumLengthValidator`` was not translated when using non-English locales (:ticket:`36314`). + +* Fixed a regression in Django 5.2 that caused the ``object-tools`` block to be + rendered twice when using custom admin templates with overridden blocks due + to changes in the base admin page block structure (:ticket:`36331`). diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index f814d9b3ab..f0d7b41b64 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -127,7 +127,6 @@ from .models import ( Song, State, Story, - Subscriber, SuperSecretHideout, SuperVillain, Telegram, @@ -6859,24 +6858,6 @@ class SeleniumTests(AdminSeleniumTestCase): name_input_value = name_input.get_attribute("value") self.assertEqual(name_input_value, "Test section 1") - @screenshot_cases(["desktop_size", "mobile_size", "rtl", "dark", "high_contrast"]) - def test_long_object_str_on_change_view(self): - from selenium.webdriver.common.by import By - - self.admin_login( - username="super", password="secret", login_url=reverse("admin:index") - ) - s = Subscriber.objects.create(name="a " * 40, email="b " * 80) - self.selenium.get( - self.live_server_url - + reverse("admin:admin_views_subscriber_change", args=(s.pk,)) - ) - object_tools = self.selenium.find_elements( - By.CSS_SELECTOR, "div#content ul.object-tools li" - ) - self.assertGreater(len(object_tools), 0) - self.take_screenshot("not-overwrap") - @override_settings(ROOT_URLCONF="admin_views.urls") class ReadonlyTest(AdminFieldExtractionMixin, TestCase): |
