浏览代码

Fixed #34705 -- Reallowed BoundField.as_widget()'s attrs argument to set aria-describedby.

Regression in 966ecdd482167f3f6b08b00f484936c837751cb9.
Sage Abdullah 1 年之前
父节点
当前提交
3f73df44f2
共有 2 个文件被更改,包括 20 次插入6 次删除
  1. 9 6
      django/forms/boundfield.py
  2. 11 0
      tests/forms_tests/tests/test_forms.py

+ 9 - 6
django/forms/boundfield.py

@@ -287,12 +287,15 @@ class BoundField(RenderableFieldMixin):
                 attrs["required"] = True
         if self.field.disabled:
             attrs["disabled"] = True
-        # If a custom aria-describedby attribute is given and help_text is
-        # used, the custom aria-described by is preserved so user can set the
-        # desired order.
-        if custom_aria_described_by_id := widget.attrs.get("aria-describedby"):
-            attrs["aria-describedby"] = custom_aria_described_by_id
-        elif self.field.help_text and self.id_for_label:
+        # If a custom aria-describedby attribute is given (either via the attrs
+        # argument or widget.attrs) and help_text is used, the custom
+        # aria-described by is preserved so user can set the desired order.
+        if (
+            not attrs.get("aria-describedby")
+            and not widget.attrs.get("aria-describedby")
+            and self.field.help_text
+            and self.id_for_label
+        ):
             attrs["aria-describedby"] = f"{self.id_for_label}_helptext"
         return attrs
 

+ 11 - 0
tests/forms_tests/tests/test_forms.py

@@ -3082,6 +3082,17 @@ Options: <select multiple name="options" required>
             "</span></td></tr>",
         )
 
+    def test_as_widget_custom_aria_describedby(self):
+        class FoodForm(Form):
+            intl_name = CharField(help_text="The food's international name.")
+
+        form = FoodForm({"intl_name": "Rendang"})
+        self.assertHTMLEqual(
+            form["intl_name"].as_widget(attrs={"aria-describedby": "some_custom_id"}),
+            '<input type="text" name="intl_name" value="Rendang"'
+            'aria-describedby="some_custom_id" required id="id_intl_name">',
+        )
+
     def test_subclassing_forms(self):
         # You can subclass a Form to add fields. The resulting form subclass will have
         # all of the fields of the parent Form, plus whichever fields you define in the