diff --git a/django/forms/boundfield.py b/django/forms/boundfield.py index 97559fe286..5b8e7e5697 100644 --- a/django/forms/boundfield.py +++ b/django/forms/boundfield.py @@ -192,7 +192,9 @@ class BoundField(RenderableFieldMixin): if id_: id_for_label = widget.id_for_label(id_) if id_for_label: - attrs = {**(attrs or {}), "for": id_for_label} + attrs = attrs or {} + if tag != "legend": + attrs = {**attrs, "for": id_for_label} if self.field.required and hasattr(self.form, "required_css_class"): attrs = attrs or {} if "class" in attrs: diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py index 5b0c4b9a04..8cc1fecf0a 100644 --- a/tests/forms_tests/tests/test_forms.py +++ b/tests/forms_tests/tests/test_forms.py @@ -3913,7 +3913,7 @@ aria-describedby="id_age_error">""", ) self.assertHTMLEqual( f["field"].legend_tag(), - 'Field:', + 'Field:', ) self.assertHTMLEqual( f["field"].label_tag(attrs={"class": "foo"}), @@ -3921,14 +3921,14 @@ aria-describedby="id_age_error">""", ) self.assertHTMLEqual( f["field"].legend_tag(attrs={"class": "foo"}), - 'Field:', + 'Field:', ) self.assertHTMLEqual( f["field2"].label_tag(), 'Field2:' ) self.assertHTMLEqual( f["field2"].legend_tag(), - 'Field2:', + "Field2:", ) def test_label_split_datetime_not_displayed(self): @@ -4190,31 +4190,47 @@ aria-describedby="id_age_error">""", boundfield = SomeForm()["field"] - testcases = [ # (args, kwargs, expected) - # without anything: just print the - ((), {}, '<%(tag)s for="id_field">Field:%(tag)s>'), + testcases = [ # (args, kwargs, expected_label, expected_legend) + # without anything: just print the / + ((), {}, 'Field:', "Field:"), # passing just one argument: overrides the field's label - (("custom",), {}, '<%(tag)s for="id_field">custom:%(tag)s>'), + ( + ("custom",), + {}, + 'custom:', + "custom:", + ), # the overridden label is escaped - (("custom&",), {}, '<%(tag)s for="id_field">custom&:%(tag)s>'), - ((mark_safe("custom&"),), {}, '<%(tag)s for="id_field">custom&:%(tag)s>'), - # Passing attrs to add extra attributes on the + ( + ("custom&",), + {}, + 'custom&:', + "custom&:", + ), + ( + (mark_safe("custom&"),), + {}, + 'custom&:', + "custom&:", + ), + # Passing attrs to add extra attributes on the / ( (), {"attrs": {"class": "pretty"}}, - '<%(tag)s for="id_field" class="pretty">Field:%(tag)s>', + 'Field:', + 'Field:', ), ] - for args, kwargs, expected in testcases: + for args, kwargs, expected_label, expected_legend in testcases: with self.subTest(args=args, kwargs=kwargs): self.assertHTMLEqual( boundfield.label_tag(*args, **kwargs), - expected % {"tag": "label"}, + expected_label, ) self.assertHTMLEqual( boundfield.legend_tag(*args, **kwargs), - expected % {"tag": "legend"}, + expected_legend, ) def test_boundfield_label_tag_no_id(self): @@ -4252,7 +4268,7 @@ aria-describedby="id_age_error">""", ) self.assertHTMLEqual( form["custom"].legend_tag(), - 'Custom:', + "Custom:", ) self.assertHTMLEqual(form["empty"].label_tag(), "Empty:") self.assertHTMLEqual(form["empty"].legend_tag(), "Empty:") @@ -4266,7 +4282,7 @@ aria-describedby="id_age_error">""", self.assertHTMLEqual(boundfield.label_tag(), '') self.assertHTMLEqual( boundfield.legend_tag(), - '', + "", ) def test_boundfield_id_for_label(self): @@ -4339,7 +4355,7 @@ aria-describedby="id_age_error">""", ) self.assertHTMLEqual( boundfield.legend_tag(label_suffix="$"), - 'Field$', + "Field$", ) def test_error_dict(self): @@ -4879,7 +4895,7 @@ aria-describedby="id_age_error">""", ) self.assertEqual( field.legend_tag(), - 'First name:', + "First name:", ) @override_settings(USE_THOUSAND_SEPARATOR=True) @@ -4892,7 +4908,7 @@ aria-describedby="id_age_error">""", ) self.assertHTMLEqual( field.legend_tag(attrs={"number": 9999}), - 'First name:', + 'First name:', ) def test_remove_cached_field(self): @@ -5204,12 +5220,12 @@ class TemplateTests(SimpleTestCase): self.assertHTMLEqual( t.render(Context({"form": f})), "" - 'Username:' + "Username:" '' - 'Password1:' + "Password1:" '' - 'Password2:' + "Password2:" '' '' "", diff --git a/tests/forms_tests/tests/test_i18n.py b/tests/forms_tests/tests/test_i18n.py index 5da0c0e3d0..5b8d92c0f6 100644 --- a/tests/forms_tests/tests/test_i18n.py +++ b/tests/forms_tests/tests/test_i18n.py @@ -59,14 +59,14 @@ class FormsI18nTests(SimpleTestCase): ) self.assertHTMLEqual( f["field_1"].legend_tag(), - 'field_1:', + "field_1:", ) self.assertHTMLEqual( f["field_2"].label_tag(), 'field_2:' ) self.assertHTMLEqual( f["field_2"].legend_tag(), - 'field_2:', + "field_2:", ) def test_non_ascii_choices(self): diff --git a/tests/forms_tests/widget_tests/test_clearablefileinput.py b/tests/forms_tests/widget_tests/test_clearablefileinput.py index 8d3bff4b45..8f2d951966 100644 --- a/tests/forms_tests/widget_tests/test_clearablefileinput.py +++ b/tests/forms_tests/widget_tests/test_clearablefileinput.py @@ -248,12 +248,12 @@ class ClearableFileInputTest(WidgetTest): form = TestForm() self.assertIs(self.widget.use_fieldset, True) self.assertHTMLEqual( - 'Field:' + "Field:" '' - 'With file:Currently: ' + "With file:Currently: " 'somethingChange:' - 'Clearable file:' + "Clearable file:" 'Currently: something' 'ClearChange:' diff --git a/tests/forms_tests/widget_tests/test_selectdatewidget.py b/tests/forms_tests/widget_tests/test_selectdatewidget.py index 017e90f5f6..ff1f59a46c 100644 --- a/tests/forms_tests/widget_tests/test_selectdatewidget.py +++ b/tests/forms_tests/widget_tests/test_selectdatewidget.py @@ -718,7 +718,7 @@ class SelectDateWidgetTest(WidgetTest): form = TestForm() self.assertIs(self.widget.use_fieldset, True) self.assertHTMLEqual( - 'Field:' + "Field:" '' 'JanuaryFebruary' 'MarchApril' diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 129ce56c7a..7783b817d5 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -977,15 +977,15 @@ class TestFieldOverridesByFormMeta(SimpleTestCase): ) self.assertHTMLEqual( form["name"].legend_tag(), - 'Title:', + "Title:", ) self.assertHTMLEqual( form["url"].legend_tag(), - 'The URL:', + "The URL:", ) self.assertHTMLEqual( form["slug"].legend_tag(), - 'Slug:', + "Slug:", ) def test_help_text_overrides(self): diff --git a/tests/model_formsets/tests.py b/tests/model_formsets/tests.py index cd60795fc8..4e5c0e39c5 100644 --- a/tests/model_formsets/tests.py +++ b/tests/model_formsets/tests.py @@ -2161,7 +2161,7 @@ class TestModelFormsetOverridesTroughFormMeta(TestCase): ) self.assertHTMLEqual( form["title"].legend_tag(), - 'Name:', + "Name:", ) def test_inlineformset_factory_labels_overrides(self): @@ -2174,7 +2174,7 @@ class TestModelFormsetOverridesTroughFormMeta(TestCase): ) self.assertHTMLEqual( form["title"].legend_tag(), - 'Name:', + "Name:", ) def test_modelformset_factory_help_text_overrides(self):
Username:' + "
Username:" '
Password1:' + "
Password1:" '
Password2:' + "
Password2:" '