summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantoliny0919 <antoliny0919@gmail.com>2025-04-17 19:38:26 +0900
committerNatalia <124304+nessita@users.noreply.github.com>2025-04-22 22:14:54 -0300
commit97c93549fc864af61cb1ae1fd171a3c7ac6ee89a (patch)
tree718a4c2841dfd1d2e5de4f3ee46e5f48ee82f90d
parentadf2991d32c24f8b2e549a25a7eda52f317a91a6 (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.css5
-rw-r--r--django/contrib/admin/static/admin/css/responsive.css4
-rw-r--r--django/contrib/admin/templates/admin/base.html2
-rw-r--r--django/contrib/admin/templates/admin/change_form.html3
-rw-r--r--django/contrib/admin/templates/admin/change_list.html15
-rw-r--r--docs/releases/5.2.1.txt4
-rw-r--r--tests/admin_views/tests.py19
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):