From c4429af53f7e7752cd6980960a38f977693ecb09 Mon Sep 17 00:00:00 2001 From: Nilesh Kumar Pahari Date: Tue, 13 Jan 2026 00:39:48 +0530 Subject: [6.0.x] Fixed #36850 -- Prevented admin filter sidebar from wrapping below the changelist. Removed flex-wrap from .changelist-form-container and added min-width to the main content container to ensure proper layout behavior. Regression in 6ea331907996a51842da55c1f8d65eea7b367c7d. Backport of e92d1e3b7858981185e93d717c5727544d66b66e from main. --- django/contrib/admin/static/admin/css/changelists.css | 2 +- docs/releases/6.0.2.txt | 5 ++++- tests/admin_views/models.py | 8 +++++++- tests/admin_views/tests.py | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/static/admin/css/changelists.css b/django/contrib/admin/static/admin/css/changelists.css index 60cbaf21eb..0f367f811e 100644 --- a/django/contrib/admin/static/admin/css/changelists.css +++ b/django/contrib/admin/static/admin/css/changelists.css @@ -2,7 +2,6 @@ #changelist .changelist-form-container { display: flex; - flex-wrap: wrap; align-items: flex-start; width: 100%; } @@ -16,6 +15,7 @@ } #changelist .changelist-form-container:has(#changelist-filter) > div { + min-width: 0; max-width: calc(100% - 270px); } diff --git a/docs/releases/6.0.2.txt b/docs/releases/6.0.2.txt index c708f699bb..c437275f3f 100644 --- a/docs/releases/6.0.2.txt +++ b/docs/releases/6.0.2.txt @@ -9,4 +9,7 @@ Django 6.0.2 fixes several bugs in 6.0.1. Bugfixes ======== -* ... +* Fixed a visual regression in Django 6.0 that caused the admin filter sidebar + to wrap below the changelist when filter elements contained long text + (:ticket:`36850`). + diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py index 4e2d13efa8..fe127f57d3 100644 --- a/tests/admin_views/models.py +++ b/tests/admin_views/models.py @@ -266,7 +266,13 @@ class Person(models.Model): (2, "Female"), ) name = models.CharField(max_length=100) - gender = models.IntegerField(choices=GENDER_CHOICES) + gender = models.IntegerField( + choices=GENDER_CHOICES, + verbose_name=( + "very very very very very very very very very " + "loooooooooooooooooooooooooooooooooooooooooong name" + ), + ) age = models.IntegerField(default=21) alive = models.BooleanField(default=True) diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index ad37416cbf..e5eba4f466 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -7059,6 +7059,21 @@ class SeleniumTests(AdminSeleniumTestCase): self.assertTrue(show_all.is_displayed()) self.take_screenshot("pagination") + @screenshot_cases(["desktop_size", "mobile_size", "rtl", "dark", "high_contrast"]) + def test_changelist_filter_sidebar_with_long_verbose_fields(self): + from selenium.webdriver.common.by import By + + self.admin_login( + username="super", password="secret", login_url=reverse("admin:index") + ) + Person.objects.create(name="John", gender=1) + self.selenium.get( + self.live_server_url + reverse("admin:admin_views_person_changelist") + ) + changelist_filter = self.selenium.find_element(By.ID, "changelist-filter") + self.assertTrue(changelist_filter.is_displayed()) + self.take_screenshot("filter_sidebar") + @override_settings(ROOT_URLCONF="admin_views.urls") class ReadonlyTest(AdminFieldExtractionMixin, TestCase): -- cgit v1.3