diff options
| author | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2024-08-17 18:32:40 +0200 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2024-08-20 09:05:16 +0200 |
| commit | d9ae7f5b580a0e8475bbfe84a86e1bd0fd404663 (patch) | |
| tree | 7feefea3403ad350095514d77739ee0d644b964f | |
| parent | 231c0d85931b5afde3e3caec0e6bc5ca6132bb7a (diff) | |
Fixed #35686 -- Added table headers to app list tables for screen readers.
| -rw-r--r-- | django/contrib/admin/templates/admin/app_list.html | 7 | ||||
| -rw-r--r-- | tests/admin_changelist/tests.py | 2 | ||||
| -rw-r--r-- | tests/admin_views/tests.py | 24 |
3 files changed, 30 insertions, 3 deletions
diff --git a/django/contrib/admin/templates/admin/app_list.html b/django/contrib/admin/templates/admin/app_list.html index 3b67b5feab..60d874b2b6 100644 --- a/django/contrib/admin/templates/admin/app_list.html +++ b/django/contrib/admin/templates/admin/app_list.html @@ -7,6 +7,13 @@ <caption> <a href="{{ app.app_url }}" class="section" title="{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}">{{ app.name }}</a> </caption> + <thead class="visually-hidden"> + <tr> + <th scope="col">{% translate 'Model name' %}</th> + <th scope="col">{% translate 'Add link' %}</th> + <th scope="col">{% translate 'Change or view list link' %}</th> + </tr> + </thead> {% for model in app.models %} {% with model_name=model.object_name|lower %} <tr class="model-{{ model_name }}{% if model.admin_url in request.path|urlencode %} current-model{% endif %}"> diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py index 4d8845e11e..ec6820c62f 100644 --- a/tests/admin_changelist/tests.py +++ b/tests/admin_changelist/tests.py @@ -1608,7 +1608,7 @@ class ChangeListTests(TestCase): response = m.changelist_view(request) self.assertIn('<ul class="object-tools">', response.rendered_content) # The "Add" button inside the object-tools shouldn't appear. - self.assertNotIn("Add ", response.rendered_content) + self.assertNotIn("Add event", response.rendered_content) def test_search_help_text(self): superuser = self._create_superuser("superuser") diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 9dbe1e1432..9a031a1e51 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -799,7 +799,9 @@ class AdminViewBasicTest(AdminViewBasicTestCase): reverse("admin:admin_views_complexsortedperson_changelist"), {} ) # Should have 5 columns (including action checkbox col) - self.assertContains(response, '<th scope="col"', count=5) + result_list_table_re = re.compile('<table id="result_list">(.*?)</thead>') + result_list_table_head = result_list_table_re.search(str(response.content))[0] + self.assertEqual(result_list_table_head.count('<th scope="col"'), 5) self.assertContains(response, "Name") self.assertContains(response, "Colored name") @@ -830,7 +832,11 @@ class AdminViewBasicTest(AdminViewBasicTestCase): reverse("admin:admin_views_%s_changelist" % url), {} ) # Should have 3 columns including action checkbox col. - self.assertContains(response, '<th scope="col"', count=3, msg_prefix=url) + result_list_table_re = re.compile('<table id="result_list">(.*?)</thead>') + result_list_table_head = result_list_table_re.search(str(response.content))[ + 0 + ] + self.assertEqual(result_list_table_head.count('<th scope="col"'), 3) # Check if the correct column was selected. 2 is the index of the # 'order' column in the model admin's 'list_display' with 0 being # the implicit 'action_checkbox' and 1 being the column 'stuff'. @@ -7498,12 +7504,26 @@ class CSSTest(TestCase): # General index page response = self.client.get(reverse("admin:index")) self.assertContains(response, '<div class="app-admin_views module') + self.assertContains( + response, + '<thead class="visually-hidden"><tr><th scope="col">Model name</th>' + '<th scope="col">Add link</th><th scope="col">Change or view list link</th>' + "</tr></thead>", + html=True, + ) self.assertContains(response, '<tr class="model-actor">') self.assertContains(response, '<tr class="model-album">') # App index page response = self.client.get(reverse("admin:app_list", args=("admin_views",))) self.assertContains(response, '<div class="app-admin_views module') + self.assertContains( + response, + '<thead class="visually-hidden"><tr><th scope="col">Model name</th>' + '<th scope="col">Add link</th><th scope="col">Change or view list link</th>' + "</tr></thead>", + html=True, + ) self.assertContains(response, '<tr class="model-actor">') self.assertContains(response, '<tr class="model-album">') |
