1
0
mirror of https://github.com/django/django.git synced 2025-11-07 07:15:35 +00:00

Fixed #36511 -- Ensured filters came before table in keyboard navigation in admin changelist.

This commit is contained in:
antoliny0919
2025-07-20 22:12:15 +09:00
committed by Sarah Boyce
parent 792ca148a2
commit 6ea3319079
5 changed files with 92 additions and 33 deletions

View File

@@ -431,6 +431,8 @@ class PodcastAdmin(admin.ModelAdmin):
list_display = ("name", "release_date")
list_editable = ("release_date",)
date_hierarchy = "release_date"
list_filter = ("name",)
search_fields = ("name",)
ordering = ("name",)

View File

@@ -3,6 +3,8 @@ from django.contrib.auth.models import User
from django.test import override_settings
from django.urls import reverse
from .models import Podcast
@override_settings(ROOT_URLCONF="admin_views.urls")
class SeleniumTests(AdminSeleniumTestCase):
@@ -125,3 +127,45 @@ class SeleniumTests(AdminSeleniumTestCase):
)
self.assertTrue(is_vertical_scrolleable)
self.assertFalse(is_horizontal_scrolleable)
def test_skip_link_keyboard_navigation_in_changelist(self):
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
Podcast.objects.create(name="apple", release_date="2000-09-19")
self.admin_login(
username="super", password="secret", login_url=reverse("admin:index")
)
self.selenium.get(
self.live_server_url + reverse("admin:admin_views_podcast_changelist")
)
selectors = [
"ul.object-tools", # object_tools.
"search#changelist-filter", # list_filter.
"form#changelist-search", # search_fields.
"nav.toplinks", # date_hierarchy.
"form#changelist-form div.actions", # action.
"table#result_list", # table.
"div.changelist-footer", # footer.
]
content = self.selenium.find_element(By.ID, "content-start")
content.send_keys(Keys.TAB)
for selector in selectors:
with self.subTest(selector=selector):
# Currently focused element.
focused_element = self.selenium.switch_to.active_element
expected_element = self.selenium.find_element(By.CSS_SELECTOR, selector)
element_points = self.selenium.find_elements(
By.CSS_SELECTOR,
f"{selector} a, {selector} input, {selector} button",
)
self.assertIn(
focused_element.get_attribute("outerHTML"),
expected_element.get_attribute("innerHTML"),
)
# Move to the next container element via TAB.
for point in element_points[::-1]:
if point.is_displayed():
point.send_keys(Keys.TAB)
break