diff --git a/django/contrib/admin/static/admin/css/changelists.css b/django/contrib/admin/static/admin/css/changelists.css index 3557097292..1b23f145dc 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 3377a6d441..ad64762a51 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -7205,6 +7205,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):