mirror of
https://github.com/django/django.git
synced 2025-10-26 15:16:09 +00:00
Fixed #36423 -- Prevented filter_horizontal buttons from intercepting form submission.
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:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user