Skip to content

Commit 0eec2a1

Browse files
varunkasyappjacobtylerwalls
authored andcommitted
Fixed #36724 -- Removed invalid "for" attribute on <legend> tags.
1 parent 7e765a6 commit 0eec2a1

File tree

7 files changed

+52
-34
lines changed

7 files changed

+52
-34
lines changed

django/forms/boundfield.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,9 @@ def label_tag(self, contents=None, attrs=None, label_suffix=None, tag=None):
192192
if id_:
193193
id_for_label = widget.id_for_label(id_)
194194
if id_for_label:
195-
attrs = {**(attrs or {}), "for": id_for_label}
195+
attrs = attrs or {}
196+
if tag != "legend":
197+
attrs = {**attrs, "for": id_for_label}
196198
if self.field.required and hasattr(self.form, "required_css_class"):
197199
attrs = attrs or {}
198200
if "class" in attrs:

tests/forms_tests/tests/test_forms.py

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3913,22 +3913,22 @@ class SomeForm(Form):
39133913
)
39143914
self.assertHTMLEqual(
39153915
f["field"].legend_tag(),
3916-
'<legend for="id_field" class="required">Field:</legend>',
3916+
'<legend class="required">Field:</legend>',
39173917
)
39183918
self.assertHTMLEqual(
39193919
f["field"].label_tag(attrs={"class": "foo"}),
39203920
'<label for="id_field" class="foo required">Field:</label>',
39213921
)
39223922
self.assertHTMLEqual(
39233923
f["field"].legend_tag(attrs={"class": "foo"}),
3924-
'<legend for="id_field" class="foo required">Field:</legend>',
3924+
'<legend class="foo required">Field:</legend>',
39253925
)
39263926
self.assertHTMLEqual(
39273927
f["field2"].label_tag(), '<label for="id_field2">Field2:</label>'
39283928
)
39293929
self.assertHTMLEqual(
39303930
f["field2"].legend_tag(),
3931-
'<legend for="id_field2">Field2:</legend>',
3931+
"<legend>Field2:</legend>",
39323932
)
39333933

39343934
def test_label_split_datetime_not_displayed(self):
@@ -4190,31 +4190,47 @@ class SomeForm(Form):
41904190

41914191
boundfield = SomeForm()["field"]
41924192

4193-
testcases = [ # (args, kwargs, expected)
4194-
# without anything: just print the <label>
4195-
((), {}, '<%(tag)s for="id_field">Field:</%(tag)s>'),
4193+
testcases = [ # (args, kwargs, expected_label, expected_legend)
4194+
# without anything: just print the <label>/<legend>
4195+
((), {}, '<label for="id_field">Field:</label>', "<legend>Field:</legend>"),
41964196
# passing just one argument: overrides the field's label
4197-
(("custom",), {}, '<%(tag)s for="id_field">custom:</%(tag)s>'),
4197+
(
4198+
("custom",),
4199+
{},
4200+
'<label for="id_field">custom:</label>',
4201+
"<legend>custom:</legend>",
4202+
),
41984203
# the overridden label is escaped
4199-
(("custom&",), {}, '<%(tag)s for="id_field">custom&amp;:</%(tag)s>'),
4200-
((mark_safe("custom&"),), {}, '<%(tag)s for="id_field">custom&:</%(tag)s>'),
4201-
# Passing attrs to add extra attributes on the <label>
4204+
(
4205+
("custom&",),
4206+
{},
4207+
'<label for="id_field">custom&amp;:</label>',
4208+
"<legend>custom&amp;:</legend>",
4209+
),
4210+
(
4211+
(mark_safe("custom&"),),
4212+
{},
4213+
'<label for="id_field">custom&:</label>',
4214+
"<legend>custom&:</legend>",
4215+
),
4216+
# Passing attrs to add extra attributes on the <label>/<legend>
42024217
(
42034218
(),
42044219
{"attrs": {"class": "pretty"}},
4205-
'<%(tag)s for="id_field" class="pretty">Field:</%(tag)s>',
4220+
'<label for="id_field" class="pretty">Field:</label>',
4221+
'<legend class="pretty">Field:</legend>',
42064222
),
42074223
]
42084224

4209-
for args, kwargs, expected in testcases:
4225+
for args, kwargs, expected_label, expected_legend in testcases:
42104226
with self.subTest(args=args, kwargs=kwargs):
42114227
self.assertHTMLEqual(
42124228
boundfield.label_tag(*args, **kwargs),
4213-
expected % {"tag": "label"},
4229+
expected_label,
42144230
)
42154231
self.assertHTMLEqual(
42164232
boundfield.legend_tag(*args, **kwargs),
4217-
expected % {"tag": "legend"},
4233+
expected_legend,
42184234
)
42194235

42204236
def test_boundfield_label_tag_no_id(self):
@@ -4252,7 +4268,7 @@ class SomeForm(Form):
42524268
)
42534269
self.assertHTMLEqual(
42544270
form["custom"].legend_tag(),
4255-
'<legend for="custom_id_custom">Custom:</legend>',
4271+
"<legend>Custom:</legend>",
42564272
)
42574273
self.assertHTMLEqual(form["empty"].label_tag(), "<label>Empty:</label>")
42584274
self.assertHTMLEqual(form["empty"].legend_tag(), "<legend>Empty:</legend>")
@@ -4266,7 +4282,7 @@ class SomeForm(Form):
42664282
self.assertHTMLEqual(boundfield.label_tag(), '<label for="id_field"></label>')
42674283
self.assertHTMLEqual(
42684284
boundfield.legend_tag(),
4269-
'<legend for="id_field"></legend>',
4285+
"<legend></legend>",
42704286
)
42714287

42724288
def test_boundfield_id_for_label(self):
@@ -4339,7 +4355,7 @@ class SomeForm(Form):
43394355
)
43404356
self.assertHTMLEqual(
43414357
boundfield.legend_tag(label_suffix="$"),
4342-
'<legend for="id_field">Field$</legend>',
4358+
"<legend>Field$</legend>",
43434359
)
43444360

43454361
def test_error_dict(self):
@@ -4879,7 +4895,7 @@ def test_label_does_not_include_new_line(self):
48794895
)
48804896
self.assertEqual(
48814897
field.legend_tag(),
4882-
'<legend for="id_first_name">First name:</legend>',
4898+
"<legend>First name:</legend>",
48834899
)
48844900

48854901
@override_settings(USE_THOUSAND_SEPARATOR=True)
@@ -4892,7 +4908,7 @@ def test_label_attrs_not_localized(self):
48924908
)
48934909
self.assertHTMLEqual(
48944910
field.legend_tag(attrs={"number": 9999}),
4895-
'<legend number="9999" for="id_first_name">First name:</legend>',
4911+
'<legend number="9999">First name:</legend>',
48964912
)
48974913

48984914
def test_remove_cached_field(self):
@@ -5204,12 +5220,12 @@ def clean(self):
52045220
self.assertHTMLEqual(
52055221
t.render(Context({"form": f})),
52065222
"<form>"
5207-
'<p><legend for="id_username">Username:</legend>'
5223+
"<p><legend>Username:</legend>"
52085224
'<input id="id_username" type="text" name="username" maxlength="10" '
52095225
'aria-describedby="id_username_helptext" required></p>'
5210-
'<p><legend for="id_password1">Password1:</legend>'
5226+
"<p><legend>Password1:</legend>"
52115227
'<input type="password" name="password1" id="id_password1" required></p>'
5212-
'<p><legend for="id_password2">Password2:</legend>'
5228+
"<p><legend>Password2:</legend>"
52135229
'<input type="password" name="password2" id="id_password2" required></p>'
52145230
'<input type="submit" required>'
52155231
"</form>",

tests/forms_tests/tests/test_i18n.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ class SomeForm(Form):
5959
)
6060
self.assertHTMLEqual(
6161
f["field_1"].legend_tag(),
62-
'<legend for="id_field_1">field_1:</legend>',
62+
"<legend>field_1:</legend>",
6363
)
6464
self.assertHTMLEqual(
6565
f["field_2"].label_tag(), '<label for="field_2_id">field_2:</label>'
6666
)
6767
self.assertHTMLEqual(
6868
f["field_2"].legend_tag(),
69-
'<legend for="field_2_id">field_2:</legend>',
69+
"<legend>field_2:</legend>",
7070
)
7171

7272
def test_non_ascii_choices(self):

tests/forms_tests/widget_tests/test_clearablefileinput.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,12 @@ class TestForm(Form):
248248
form = TestForm()
249249
self.assertIs(self.widget.use_fieldset, True)
250250
self.assertHTMLEqual(
251-
'<div><fieldset><legend for="id_field">Field:</legend>'
251+
"<div><fieldset><legend>Field:</legend>"
252252
'<input id="id_field" name="field" type="file" required></fieldset></div>'
253-
'<div><fieldset><legend for="id_with_file">With file:</legend>Currently: '
253+
"<div><fieldset><legend>With file:</legend>Currently: "
254254
'<a href="something">something</a><br>Change:<input type="file" '
255255
'name="with_file" id="id_with_file"></fieldset></div>'
256-
'<div><fieldset><legend for="id_clearable_file">Clearable file:</legend>'
256+
"<div><fieldset><legend>Clearable file:</legend>"
257257
'Currently: <a href="something">something</a><input '
258258
'type="checkbox" name="clearable_file-clear" id="clearable_file-clear_id">'
259259
'<label for="clearable_file-clear_id">Clear</label><br>Change:'

tests/forms_tests/widget_tests/test_selectdatewidget.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ class TestForm(Form):
718718
form = TestForm()
719719
self.assertIs(self.widget.use_fieldset, True)
720720
self.assertHTMLEqual(
721-
'<div><fieldset><legend for="id_field_month">Field:</legend>'
721+
"<div><fieldset><legend>Field:</legend>"
722722
'<select name="field_month" required id="id_field_month">'
723723
'<option value="1">January</option><option value="2">February</option>'
724724
'<option value="3">March</option><option value="4">April</option>'

tests/model_forms/tests.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -977,15 +977,15 @@ def test_label_overrides(self):
977977
)
978978
self.assertHTMLEqual(
979979
form["name"].legend_tag(),
980-
'<legend for="id_name">Title:</legend>',
980+
"<legend>Title:</legend>",
981981
)
982982
self.assertHTMLEqual(
983983
form["url"].legend_tag(),
984-
'<legend for="id_url">The URL:</legend>',
984+
"<legend>The URL:</legend>",
985985
)
986986
self.assertHTMLEqual(
987987
form["slug"].legend_tag(),
988-
'<legend for="id_slug">Slug:</legend>',
988+
"<legend>Slug:</legend>",
989989
)
990990

991991
def test_help_text_overrides(self):

tests/model_formsets/tests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,7 +2161,7 @@ def test_modelformset_factory_labels_overrides(self):
21612161
)
21622162
self.assertHTMLEqual(
21632163
form["title"].legend_tag(),
2164-
'<legend for="id_title">Name:</legend>',
2164+
"<legend>Name:</legend>",
21652165
)
21662166

21672167
def test_inlineformset_factory_labels_overrides(self):
@@ -2174,7 +2174,7 @@ def test_inlineformset_factory_labels_overrides(self):
21742174
)
21752175
self.assertHTMLEqual(
21762176
form["title"].legend_tag(),
2177-
'<legend for="id_title">Name:</legend>',
2177+
"<legend>Name:</legend>",
21782178
)
21792179

21802180
def test_modelformset_factory_help_text_overrides(self):

0 commit comments

Comments
 (0)