Fixed #36423 -- Prevented filter_horizontal buttons from intercepting form submission.
Some checks are pending
Docs / docs (push) Waiting to run
Docs / blacken-docs (push) Waiting to run
Linters / flake8 (push) Waiting to run
Linters / isort (push) Waiting to run
Linters / black (push) Waiting to run
Tests / Windows, SQLite, Python 3.13 (push) Waiting to run
Tests / JavaScript tests (push) Waiting to run

In the admin's filter_horizontal widget, optional action buttons like
"Choose all", "Remove all", etc. were changed from `<a>` to `<button>`
elements in #34619, but without specifying `type="button"`. As a result,
when pressing Enter while focused on a form input, these buttons could
be triggered and intercept form submission.

Explicitly set `type="button"` on these control buttons to prevent them
from acting as submit buttons.

Thanks Antoliny Lee for the quick triage and review.

Regression in 857b1048d5.
This commit is contained in:
Blayze 2025-05-28 11:22:29 -07:00 committed by nessita
parent 1a74434399
commit 90429625a8
5 changed files with 56 additions and 4 deletions

View file

@ -1737,6 +1737,48 @@ class HorizontalVerticalFilterSeleniumTests(AdminWidgetSeleniumTestCase):
self.assertCountSeleniumElements("#id_students_to > option", 2)
def test_form_submission_via_enter_key_with_filter_horizontal(self):
"""
The main form can be submitted correctly by pressing the enter key.
There is no shadowing from other buttons inside the form.
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
self.school.students.set([self.peter])
self.school.alumni.set([self.lisa])
self.admin_login(username="super", password="secret", login_url="/")
self.selenium.get(
self.live_server_url
+ reverse("admin:admin_widgets_school_change", args=(self.school.id,))
)
self.wait_page_ready()
self.select_option("#id_students_from", str(self.lisa.id))
self.selenium.find_element(By.ID, "id_students_add").click()
self.select_option("#id_alumni_from", str(self.peter.id))
self.selenium.find_element(By.ID, "id_alumni_add").click()
# Trigger form submission via Enter key on a text input field.
name_input = self.selenium.find_element(By.ID, "id_name")
name_input.click()
name_input.send_keys(Keys.ENTER)
# Form was submitted, success message should be shown.
self.wait_for_text(
"li.success", "The school “School of Awesome” was changed successfully."
)
# Changes should be stored properly in the database.
school = School.objects.get(id=self.school.id)
self.assertSequenceEqual(
school.students.all().order_by("name"), [self.lisa, self.peter]
)
self.assertSequenceEqual(
school.alumni.all().order_by("name"), [self.lisa, self.peter]
)
class AdminRawIdWidgetSeleniumTests(AdminWidgetSeleniumTestCase):
def setUp(self):