From 97c93549fc864af61cb1ae1fd171a3c7ac6ee89a Mon Sep 17 00:00:00 2001 From: antoliny0919 Date: Thu, 17 Apr 2025 19:38:26 +0900 Subject: [PATCH] [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. --- .../contrib/admin/static/admin/css/base.css | 5 +---- .../admin/static/admin/css/responsive.css | 4 ---- .../contrib/admin/templates/admin/base.html | 2 +- .../admin/templates/admin/change_form.html | 3 +-- .../admin/templates/admin/change_list.html | 15 +++++++-------- docs/releases/5.2.1.txt | 4 ++++ 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 @@
{% block pretitle %}{% endblock %} {% block content_title %}{% if title %}

{{ title }}

{% endif %}{% endblock %} - {% block object-tools %}{% endblock %} {% block content_subtitle %}{% if subtitle %}

{{ subtitle }}

{% 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 %}
{% block object-tools %} {% if change and not is_popup %}
    @@ -33,8 +34,6 @@
{% endif %} {% endblock %} - -{% block content %}
{% csrf_token %}{% block form_top %}{% endblock %}
{% if is_popup %}{% 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 %} -
    - {% block object-tools-items %} - {% change_list_object_tools %} - {% endblock %} -
-{% endblock %} - {% block content %}
+ {% block object-tools %} +
    + {% block object-tools-items %} + {% change_list_object_tools %} + {% endblock %} +
+ {% endblock %} {% if cl.formset and cl.formset.errors %}

{% 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):