summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantoliny0919 <antoliny0919@gmail.com>2025-01-12 19:22:15 +0900
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-02-04 08:49:07 +0100
commitd03102a5a88c3666295ebb4d4d9d25b28bd374bb (patch)
treef69dc44189e5e07e0bd158000c590fc1fe213c69
parent303c2569dad4e3222e94fc5b76dc7b83b35fde17 (diff)
[5.2.x] Fixed #36055 -- Prevented overlap of object-tools buttons and page header in the admin.
Backport of b1324a680add78de24c763911d0eefa19b9263bc from main.
-rw-r--r--django/contrib/admin/static/admin/css/base.css5
-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--tests/admin_views/tests.py19
5 files changed, 34 insertions, 10 deletions
diff --git a/django/contrib/admin/static/admin/css/base.css b/django/contrib/admin/static/admin/css/base.css
index 37910431a0..4f4773284e 100644
--- a/django/contrib/admin/static/admin/css/base.css
+++ b/django/contrib/admin/static/admin/css/base.css
@@ -773,7 +773,6 @@ a.deletelink:focus, a.deletelink:hover {
padding-left: 0;
float: right;
position: relative;
- margin-top: -48px;
}
.object-tools li {
@@ -821,6 +820,10 @@ 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/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html
index 236d759483..92f7210e02 100644
--- a/django/contrib/admin/templates/admin/base.html
+++ b/django/contrib/admin/templates/admin/base.html
@@ -98,9 +98,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 8e7ced9a48..11536b0965 100644
--- a/django/contrib/admin/templates/admin/change_form.html
+++ b/django/contrib/admin/templates/admin/change_form.html
@@ -24,7 +24,6 @@
{% endblock %}
{% endif %}
-{% block content %}<div id="content-main">
{% block object-tools %}
{% if change and not is_popup %}
<ul class="object-tools">
@@ -34,6 +33,8 @@
</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 b0b4c31619..cf96df9fe2 100644
--- a/django/contrib/admin/templates/admin/change_list.html
+++ b/django/contrib/admin/templates/admin/change_list.html
@@ -39,15 +39,16 @@
{% 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/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 8e2c55804b..2b14238f21 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -127,6 +127,7 @@ from .models import (
Song,
State,
Story,
+ Subscriber,
SuperSecretHideout,
SuperVillain,
Telegram,
@@ -6861,6 +6862,24 @@ 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):