diff options
author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-02-04 08:08:27 +0100 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-02-07 20:37:05 +0100 |
commit | 7119f40c9881666b6f9b5cf7df09ee1d21cc8344 (patch) | |
tree | fa50869f5614295f462d9bf77fec59365c621609 /tests/forms_tests | |
parent | 9c19aff7c7561e3a82978a272ecdaad40dda5c00 (diff) | |
download | django-7119f40c9881666b6f9b5cf7df09ee1d21cc8344.tar.gz |
Refs #33476 -- Refactored code to strictly match 88 characters line length.
Diffstat (limited to 'tests/forms_tests')
26 files changed, 1160 insertions, 669 deletions
diff --git a/tests/forms_tests/field_tests/test_booleanfield.py b/tests/forms_tests/field_tests/test_booleanfield.py index 560a0f473b..d6b5121b10 100644 --- a/tests/forms_tests/field_tests/test_booleanfield.py +++ b/tests/forms_tests/field_tests/test_booleanfield.py @@ -52,7 +52,8 @@ class BooleanFieldTest(SimpleTestCase): self.assertTrue(f.has_changed(True, "")) # Initial value may have mutated to a string due to show_hidden_initial (#19537) self.assertTrue(f.has_changed("False", "on")) - # HiddenInput widget sends string values for boolean but doesn't clean them in value_from_datadict + # HiddenInput widget sends string values for boolean but doesn't clean + # them in value_from_datadict. self.assertFalse(f.has_changed(False, "False")) self.assertFalse(f.has_changed(True, "True")) self.assertTrue(f.has_changed(False, "True")) diff --git a/tests/forms_tests/field_tests/test_decimalfield.py b/tests/forms_tests/field_tests/test_decimalfield.py index 6e49a41341..119a74292c 100644 --- a/tests/forms_tests/field_tests/test_decimalfield.py +++ b/tests/forms_tests/field_tests/test_decimalfield.py @@ -105,7 +105,8 @@ class DecimalFieldTest(FormFieldAssertionsMixin, SimpleTestCase): ) self.assertWidgetRendersTo( f, - '<input step="0.01" name="f" min="0.5" max="1.5" type="number" id="id_f" required>', + '<input step="0.01" name="f" min="0.5" max="1.5" type="number" id="id_f" ' + "required>", ) with self.assertRaisesMessage( ValidationError, "'Ensure this value is less than or equal to 1.5.'" diff --git a/tests/forms_tests/field_tests/test_emailfield.py b/tests/forms_tests/field_tests/test_emailfield.py index d1d52dd608..869a1aacc5 100644 --- a/tests/forms_tests/field_tests/test_emailfield.py +++ b/tests/forms_tests/field_tests/test_emailfield.py @@ -49,7 +49,8 @@ class EmailFieldTest(FormFieldAssertionsMixin, SimpleTestCase): f = EmailField(min_length=10, max_length=15) self.assertWidgetRendersTo( f, - '<input id="id_f" type="email" name="f" maxlength="15" minlength="10" required>', + '<input id="id_f" type="email" name="f" maxlength="15" minlength="10" ' + "required>", ) with self.assertRaisesMessage( ValidationError, diff --git a/tests/forms_tests/field_tests/test_floatfield.py b/tests/forms_tests/field_tests/test_floatfield.py index 365684c2db..f6022807be 100644 --- a/tests/forms_tests/field_tests/test_floatfield.py +++ b/tests/forms_tests/field_tests/test_floatfield.py @@ -54,7 +54,8 @@ class FloatFieldTest(FormFieldAssertionsMixin, SimpleTestCase): f = FloatField(max_value=1.5, min_value=0.5) self.assertWidgetRendersTo( f, - '<input step="any" name="f" min="0.5" max="1.5" type="number" id="id_f" required>', + '<input step="any" name="f" min="0.5" max="1.5" type="number" id="id_f" ' + "required>", ) with self.assertRaisesMessage( ValidationError, "'Ensure this value is less than or equal to 1.5.'" @@ -73,7 +74,8 @@ class FloatFieldTest(FormFieldAssertionsMixin, SimpleTestCase): f = FloatField(widget=NumberInput(attrs={"step": 0.01, "max": 1.0, "min": 0.0})) self.assertWidgetRendersTo( f, - '<input step="0.01" name="f" min="0.0" max="1.0" type="number" id="id_f" required>', + '<input step="0.01" name="f" min="0.0" max="1.0" type="number" id="id_f" ' + "required>", ) def test_floatfield_localized(self): diff --git a/tests/forms_tests/field_tests/test_multivaluefield.py b/tests/forms_tests/field_tests/test_multivaluefield.py index 88f7490013..4c7664b81e 100644 --- a/tests/forms_tests/field_tests/test_multivaluefield.py +++ b/tests/forms_tests/field_tests/test_multivaluefield.py @@ -183,15 +183,18 @@ class MultiValueFieldTest(SimpleTestCase): form.as_table(), """ <tr><th><label>Field1:</label></th> - <td><input type="text" name="field1_0" value="some text" id="id_field1_0" required> + <td><input type="text" name="field1_0" value="some text" id="id_field1_0" + required> <select multiple name="field1_1" id="id_field1_1" required> <option value="J" selected>John</option> <option value="P" selected>Paul</option> <option value="G">George</option> <option value="R">Ringo</option> </select> - <input type="text" name="field1_2_0" value="2007-04-25" id="id_field1_2_0" required> - <input type="text" name="field1_2_1" value="06:24:00" id="id_field1_2_1" required></td></tr> + <input type="text" name="field1_2_0" value="2007-04-25" id="id_field1_2_0" + required> + <input type="text" name="field1_2_1" value="06:24:00" id="id_field1_2_1" + required></td></tr> """, ) diff --git a/tests/forms_tests/field_tests/test_nullbooleanfield.py b/tests/forms_tests/field_tests/test_nullbooleanfield.py index 5b632c8de3..c1e120c0bb 100644 --- a/tests/forms_tests/field_tests/test_nullbooleanfield.py +++ b/tests/forms_tests/field_tests/test_nullbooleanfield.py @@ -27,9 +27,11 @@ class NullBooleanFieldTest(FormFieldAssertionsMixin, SimpleTestCase): f = HiddenNullBooleanForm() self.assertHTMLEqual( - '<input type="hidden" name="hidden_nullbool1" value="True" id="id_hidden_nullbool1">' - '<input type="hidden" name="hidden_nullbool2" value="False" id="id_hidden_nullbool2">', str(f), + '<input type="hidden" name="hidden_nullbool1" value="True" ' + 'id="id_hidden_nullbool1">' + '<input type="hidden" name="hidden_nullbool2" value="False" ' + 'id="id_hidden_nullbool2">', ) def test_nullbooleanfield_3(self): @@ -69,7 +71,8 @@ class NullBooleanFieldTest(FormFieldAssertionsMixin, SimpleTestCase): self.assertTrue(f.has_changed(True, False)) self.assertTrue(f.has_changed(True, None)) self.assertTrue(f.has_changed(True, False)) - # HiddenInput widget sends string values for boolean but doesn't clean them in value_from_datadict + # HiddenInput widget sends string values for boolean but doesn't clean + # them in value_from_datadict. self.assertFalse(f.has_changed(False, "False")) self.assertFalse(f.has_changed(True, "True")) self.assertFalse(f.has_changed(None, "")) diff --git a/tests/forms_tests/models.py b/tests/forms_tests/models.py index ae212f332d..d6d0725b32 100644 --- a/tests/forms_tests/models.py +++ b/tests/forms_tests/models.py @@ -56,8 +56,11 @@ class ChoiceModel(models.Model): class ChoiceOptionModel(models.Model): - """Destination for ChoiceFieldModel's ForeignKey. - Can't reuse ChoiceModel because error_message tests require that it have no instances.""" + """ + Destination for ChoiceFieldModel's ForeignKey. + Can't reuse ChoiceModel because error_message tests require that it have no + instances. + """ name = models.CharField(max_length=10) diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py index 5467cee9ad..c5376b115f 100644 --- a/tests/forms_tests/tests/test_forms.py +++ b/tests/forms_tests/tests/test_forms.py @@ -101,18 +101,24 @@ class FormsTestCase(SimpleTestCase): self.assertEqual(p.cleaned_data["birthday"], datetime.date(1940, 10, 9)) self.assertHTMLEqual( str(p["first_name"]), - '<input type="text" name="first_name" value="John" id="id_first_name" required>', + '<input type="text" name="first_name" value="John" id="id_first_name" ' + "required>", ) self.assertHTMLEqual( str(p["last_name"]), - '<input type="text" name="last_name" value="Lennon" id="id_last_name" required>', + '<input type="text" name="last_name" value="Lennon" id="id_last_name" ' + "required>", ) self.assertHTMLEqual( str(p["birthday"]), - '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" required>', + '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" ' + "required>", ) - msg = "Key 'nonexistentfield' not found in 'Person'. Choices are: birthday, first_name, last_name." + msg = ( + "Key 'nonexistentfield' not found in 'Person'. Choices are: birthday, " + "first_name, last_name." + ) with self.assertRaisesMessage(KeyError, msg): p["nonexistentfield"] @@ -143,12 +149,17 @@ class FormsTestCase(SimpleTestCase): ) self.assertHTMLEqual( str(p), - """<tr><th><label for="id_first_name">First name:</label></th><td> -<input type="text" name="first_name" value="John" id="id_first_name" required></td></tr> -<tr><th><label for="id_last_name">Last name:</label></th><td> -<input type="text" name="last_name" value="Lennon" id="id_last_name" required></td></tr> -<tr><th><label for="id_birthday">Birthday:</label></th><td> -<input type="text" name="birthday" value="1940-10-9" id="id_birthday" required></td></tr>""", + """ + <tr><th><label for="id_first_name">First name:</label></th><td> + <input type="text" name="first_name" value="John" id="id_first_name" + required></td></tr> + <tr><th><label for="id_last_name">Last name:</label></th><td> + <input type="text" name="last_name" value="Lennon" id="id_last_name" + required></td></tr> + <tr><th><label for="id_birthday">Birthday:</label></th><td> + <input type="text" name="birthday" value="1940-10-9" id="id_birthday" + required></td></tr> + """, ) def test_empty_dict(self): @@ -276,33 +287,41 @@ class FormsTestCase(SimpleTestCase): self.assertHTMLEqual( p.as_table(), '<tr><th><label for="id_first_name">First name:</label></th><td>' - '<input type="text" name="first_name" value="John" id="id_first_name" required></td></tr>\n' + '<input type="text" name="first_name" value="John" id="id_first_name" ' + "required></td></tr>\n" '<tr><th><label for="id_last_name">Last name:</label>' '</th><td><input type="text" name="last_name" ' 'value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111"' 'id="id_last_name" required></td></tr>\n' '<tr><th><label for="id_birthday">Birthday:</label></th><td>' - '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" required></td></tr>', + '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" ' + "required></td></tr>", ) self.assertHTMLEqual( p.as_ul(), '<li><label for="id_first_name">First name:</label> ' - '<input type="text" name="first_name" value="John" id="id_first_name" required></li>\n' + '<input type="text" name="first_name" value="John" id="id_first_name" ' + "required></li>\n" '<li><label for="id_last_name">Last name:</label> ' '<input type="text" name="last_name" ' - 'value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" required></li>\n' + 'value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" ' + 'id="id_last_name" required></li>\n' '<li><label for="id_birthday">Birthday:</label> ' - '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" required></li>', + '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" ' + "required></li>", ) self.assertHTMLEqual( p.as_p(), '<p><label for="id_first_name">First name:</label> ' - '<input type="text" name="first_name" value="John" id="id_first_name" required></p>\n' + '<input type="text" name="first_name" value="John" id="id_first_name" ' + "required></p>\n" '<p><label for="id_last_name">Last name:</label> ' '<input type="text" name="last_name" ' - 'value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" required></p>\n' + 'value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" ' + 'id="id_last_name" required></p>\n' '<p><label for="id_birthday">Birthday:</label> ' - '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" required></p>', + '<input type="text" name="birthday" value="1940-10-9" id="id_birthday" ' + "required></p>", ) p = Person({"last_name": "Lennon"}) @@ -357,11 +376,11 @@ class FormsTestCase(SimpleTestCase): self.assertEqual(p.cleaned_data["birthday"], datetime.date(1940, 10, 9)) def test_optional_data(self): - # cleaned_data will include a key and value for *all* fields defined in the Form, - # even if the Form's data didn't include a value for fields that are not - # required. In this example, the data dictionary doesn't include a value for the - # "nick_name" field, but cleaned_data includes it. For CharFields, it's set to the - # empty string. + # cleaned_data will include a key and value for *all* fields defined in + # the Form, even if the Form's data didn't include a value for fields + # that are not required. In this example, the data dictionary doesn't + # include a value for the "nick_name" field, but cleaned_data includes + # it. For CharFields, it's set to the empty string. class OptionalPersonForm(Form): first_name = CharField() last_name = CharField() @@ -388,10 +407,10 @@ class FormsTestCase(SimpleTestCase): self.assertEqual(f.cleaned_data["last_name"], "Lennon") def test_auto_id(self): - # "auto_id" tells the Form to add an "id" attribute to each form element. - # If it's a string that contains '%s', Django will use that as a format string - # into which the field's name will be inserted. It will also put a <label> around - # the human-readable labels for a field. + # "auto_id" tells the Form to add an "id" attribute to each form + # element. If it's a string that contains '%s', Django will use that as + # a format string into which the field's name will be inserted. It will + # also put a <label> around the human-readable labels for a field. p = Person(auto_id="%s_id") self.assertHTMLEqual( p.as_table(), @@ -728,18 +747,21 @@ class FormsTestCase(SimpleTestCase): </div></li>""", ) - # Regarding auto_id and <label>, RadioSelect is a special case. Each radio button - # gets a distinct ID, formed by appending an underscore plus the button's - # zero-based index. + # Regarding auto_id and <label>, RadioSelect is a special case. Each + # radio button gets a distinct ID, formed by appending an underscore + # plus the button's zero-based index. f = FrameworkForm(auto_id="id_%s") self.assertHTMLEqual( str(f["language"]), - """<div id="id_language"> -<div><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" required> -Python</label></div> -<div><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" required> -Java</label></div> -</div>""", + """ + <div id="id_language"> + <div><label for="id_language_0"> + <input type="radio" id="id_language_0" value="P" name="language" required> + Python</label></div> + <div><label for="id_language_1"> + <input type="radio" id="id_language_1" value="J" name="language" required> + Java</label></div> + </div>""", ) # When RadioSelect is used with auto_id, and the whole form is printed @@ -748,33 +770,47 @@ Java</label></div> # accessibility for screen reader users. self.assertHTMLEqual( f.as_table(), - """<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" required></td></tr> -<tr><th><label>Language:</label></th><td><div id="id_language"> -<div><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" required> -Python</label></div> -<div><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" required> -Java</label></div> -</div></td></tr>""", + """ + <tr><th><label for="id_name">Name:</label></th><td> + <input type="text" name="name" id="id_name" required></td></tr> + <tr><th><label>Language:</label></th><td><div id="id_language"> + <div><label for="id_language_0"> + <input type="radio" id="id_language_0" value="P" name="language" required> + Python</label></div> + <div><label for="id_language_1"> + <input type="radio" id="id_language_1" value="J" name="language" required> + Java</label></div> + </div></td></tr>""", ) self.assertHTMLEqual( f.as_ul(), - """<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" required></li> -<li><label>Language:</label> <div id="id_language"> -<div><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" required> -Python</label></div> -<div><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" required> -Java</label></div> -</div></li>""", + """ + <li><label for="id_name">Name:</label> + <input type="text" name="name" id="id_name" required></li> + <li><label>Language:</label> <div id="id_language"> + <div><label for="id_language_0"> + <input type="radio" id="id_language_0" value="P" name="language" required> + Python</label></div> + <div><label for="id_language_1"> + <input type="radio" id="id_language_1" value="J" name="language" required> + Java</label></div> + </div></li> + """, ) self.assertHTMLEqual( f.as_p(), - """<p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" required></p> -<p><label>Language:</label> <div id="id_language"> -<div><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" required> -Python</label></div> -<div><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" required> -Java</label></div> -</div></p>""", + """ + <p><label for="id_name">Name:</label> + <input type="text" name="name" id="id_name" required></p> + <p><label>Language:</label> <div id="id_language"> + <div><label for="id_language_0"> + <input type="radio" id="id_language_0" value="P" name="language" required> + Python</label></div> + <div><label for="id_language_1"> + <input type="radio" id="id_language_1" value="J" name="language" required> + Java</label></div> + </div></p> + """, ) def test_form_with_iterable_boundfield(self): @@ -799,10 +835,17 @@ Java</label></div> ) self.assertHTMLEqual( "\n".join("<div>%s</div>" % bf for bf in f["name"]), - """<div><label><input type="radio" name="name" value="john" required> John</label></div> -<div><label><input type="radio" name="name" value="paul" required> Paul</label></div> -<div><label><input type="radio" name="name" value="george" required> George</label></div> -<div><label><input type="radio" name="name" value="ringo" required> Ringo</label></div>""", + """ + <div><label> + <input type="radio" name="name" value="john" required> John</label></div> + <div><label> + <input type="radio" name="name" value="paul" required> Paul</label></div> + <div><label> + <input type="radio" name="name" value="george" required> George + </label></div> + <div><label> + <input type="radio" name="name" value="ringo" required> Ringo</label></div> + """, ) def test_form_with_iterable_boundfield_id(self): @@ -858,7 +901,7 @@ Java</label></div> fields = list(BeatleForm(auto_id=False)["name"]) self.assertEqual(len(fields), 4) - self.assertEqual(fields[0].id_for_label, None) + self.assertIsNone(fields[0].id_for_label) self.assertEqual(fields[0].choice_label, "John") self.assertHTMLEqual(fields[0].tag(), '<option value="john">John</option>') self.assertHTMLEqual(str(fields[0]), '<option value="john">John</option>') @@ -1093,7 +1136,8 @@ Java</label></div> self.assertTrue(f.is_valid()) self.assertHTMLEqual( str(f["when"]), - '<input type="text" name="when_0" value="1992-01-01" id="id_when_0" required>' + '<input type="text" name="when_0" value="1992-01-01" id="id_when_0" ' + "required>" '<input type="text" name="when_1" value="01:01" id="id_when_1" required>', ) self.assertHTMLEqual( @@ -1107,26 +1151,38 @@ Java</label></div> f = SongForm(auto_id=False) self.assertHTMLEqual( str(f["composers"]), - """<div> -<div><label><input type="checkbox" name="composers" value="J"> John Lennon</label></div> -<div><label><input type="checkbox" name="composers" value="P"> Paul McCartney</label></div> -</div>""", + """ + <div> + <div><label><input type="checkbox" name="composers" value="J"> + John Lennon</label></div> + <div><label><input type="checkbox" name="composers" value="P"> + Paul McCartney</label></div> + </div> + """, ) f = SongForm({"composers": ["J"]}, auto_id=False) self.assertHTMLEqual( str(f["composers"]), - """<div> -<div><label><input checked type="checkbox" name="composers" value="J"> John Lennon</label></div> -<div><label><input type="checkbox" name="composers" value="P"> Paul McCartney</label></div> -</div>""", + """ + <div> + <div><label><input checked type="checkbox" name="composers" value="J"> + John Lennon</label></div> + <div><label><input type="checkbox" name="composers" value="P"> + Paul McCartney</label></div> + </div> + """, ) f = SongForm({"composers": ["J", "P"]}, auto_id=False) self.assertHTMLEqual( str(f["composers"]), - """<div> -<div><label><input checked type="checkbox" name="composers" value="J"> John Lennon</label></div> -<div><label><input checked type="checkbox" name="composers" value="P"> Paul McCartney</label></div> -</div>""", + """ + <div> + <div><label><input checked type="checkbox" name="composers" value="J"> + John Lennon</label></div> + <div><label><input checked type="checkbox" name="composers" value="P"> + Paul McCartney</label></div> + </div> + """, ) def test_checkbox_auto_id(self): @@ -1143,12 +1199,16 @@ Java</label></div> f = SongForm(auto_id="%s_id") self.assertHTMLEqual( str(f["composers"]), - """<div id="composers_id"> -<div><label for="composers_id_0"> -<input type="checkbox" name="composers" value="J" id="composers_id_0"> John Lennon</label></div> -<div><label for="composers_id_1"> -<input type="checkbox" name="composers" value="P" id="composers_id_1"> Paul McCartney</label></div> -</div>""", + """ + <div id="composers_id"> + <div><label for="composers_id_0"> + <input type="checkbox" name="composers" value="J" id="composers_id_0"> + John Lennon</label></div> + <div><label for="composers_id_1"> + <input type="checkbox" name="composers" value="P" id="composers_id_1"> + Paul McCartney</label></div> + </div> + """, ) def test_multiple_choice_list_data(self): @@ -1253,12 +1313,18 @@ Java</label></div> ) self.assertHTMLEqual( f.as_table(), - """<tr><th><em>Special</em> Field:</th><td> -<ul class="errorlist"><li>Something's wrong with 'Nothing to escape'</li></ul> -<input type="text" name="special_name" value="Nothing to escape" required></td></tr> -<tr><th><em>Special</em> Field:</th><td> -<ul class="errorlist"><li>'<b>Nothing to escape</b>' is a safe string</li></ul> -<input type="text" name="special_safe_name" value="Nothing to escape" required></td></tr>""", + """ + <tr><th><em>Special</em> Field:</th><td> + <ul class="errorlist"> + <li>Something's wrong with 'Nothing to escape'</li></ul> + <input type="text" name="special_name" value="Nothing to escape" required> + </td></tr> + <tr><th><em>Special</em> Field:</th><td> + <ul class="errorlist"> + <li>'<b>Nothing to escape</b>' is a safe string</li></ul> + <input type="text" name="special_safe_name" value="Nothing to escape" + required></td></tr> + """, ) f = EscapingForm( { @@ -1269,24 +1335,29 @@ Java</label></div> ) self.assertHTMLEqual( f.as_table(), - """<tr><th><em>Special</em> Field:</th><td> -<ul class="errorlist"><li>Something's wrong with 'Should escape < & > and -<script>alert('xss')</script>'</li></ul> -<input type="text" name="special_name" -value="Should escape < & > and <script>alert('xss')</script>" required></td></tr> -<tr><th><em>Special</em> Field:</th><td> -<ul class="errorlist"><li>'<b><i>Do not escape</i></b>' is a safe string</li></ul> -<input type="text" name="special_safe_name" value="<i>Do not escape</i>" required></td></tr>""", + "<tr><th><em>Special</em> Field:</th><td>" + '<ul class="errorlist"><li>' + "Something's wrong with 'Should escape < & > and " + "<script>alert('xss')</script>'</li></ul>" + '<input type="text" name="special_name" value="Should escape < & ' + '> and <script>alert('xss')</script>" required>' + "</td></tr>" + "<tr><th><em>Special</em> Field:</th><td>" + '<ul class="errorlist">' + "<li>'<b><i>Do not escape</i></b>' is a safe string</li></ul>" + '<input type="text" name="special_safe_name" ' + 'value="<i>Do not escape</i>" required></td></tr>', ) def test_validating_multiple_fields(self): - # There are a couple of ways to do multiple-field validation. If you want the - # validation message to be associated with a particular field, implement the - # clean_XXX() method on the Form, where XXX is the field name. As in - # Field.clean(), the clean_XXX() method should return the cleaned value. In the - # clean_XXX() method, you have access to self.cleaned_data, which is a dictionary - # of all the data that has been cleaned *so far*, in order by the fields, - # including the current field (e.g., the field XXX if you're in clean_XXX()). + # There are a couple of ways to do multiple-field validation. If you + # want the validation message to be associated with a particular field, + # implement the clean_XXX() method on the Form, where XXX is the field + # name. As in Field.clean(), the clean_XXX() method should return the + # cleaned value. In the clean_XXX() method, you have access to + # self.cleaned_data, which is a dictionary of all the data that has + # been cleaned *so far*, in order by the fields, including the current + # field (e.g., the field XXX if you're in clean_XXX()). class UserRegistration(Form): username = CharField(max_length=10) password1 = CharField(widget=PasswordInput) @@ -1396,19 +1467,30 @@ value="Should escape < & > and <script>alert('xss')< ) self.assertHTMLEqual( f.as_table(), - """<tr><td colspan="2"> -<ul class="errorlist nonfield"><li>Please make sure your passwords match.</li></ul></td></tr> -<tr><th>Username:</th><td><input type="text" name="username" value="adrian" maxlength="10" required></td></tr> -<tr><th>Password1:</th><td><input type="password" name="password1" required></td></tr> -<tr><th>Password2:</th><td><input type="password" name="password2" required></td></tr>""", + """ + <tr><td colspan="2"> + <ul class="errorlist nonfield"> + <li>Please make sure your passwords match.</li></ul></td></tr> + <tr><th>Username:</th><td> + <input type="text" name="username" value="adrian" maxlength="10" required> + </td></tr> + <tr><th>Password1:</th><td> + <input type="password" name="password1" required></td></tr> + <tr><th>Password2:</th><td> + <input type="password" name="password2" required></td></tr> + """, ) self.assertHTMLEqual( f.as_ul(), - """<li><ul class="errorlist nonfield"> -<li>Please make sure your passwords match.</li></ul></li> -<li>Username: <input type="text" name="username" value="adrian" maxlength="10" required></li> -<li>Password1: <input type="password" name="password1" required></li> -<li>Password2: <input type="password" name="password2" required></li>""", + """ + <li><ul class="errorlist nonfield"> + <li>Please make sure your passwords match.</li></ul></li> + <li>Username: + <input type="text" name="username" value="adrian" maxlength="10" required> + </li> + <li>Password1: <input type="password" name="password1" required></li> + <li>Password2: <input type="password" name="password2" required></li> + """, ) f = UserRegistration( @@ -1583,9 +1665,14 @@ value="Should escape < & > and <script>alert('xss')< p = Person(auto_id=False) self.assertHTMLEqual( p.as_table(), - """<tr><th>First name:</th><td><input type="text" name="first_name" required></td></tr> -<tr><th>Last name:</th><td><input type="text" name="last_name" required></td></tr> -<tr><th>Birthday:</th><td><input type="text" name="birthday" required></td></tr>""", + """ + <tr><th>First name:</th><td> + <input type="text" name="first_name" required></td></tr> + <tr><th>Last name:</th><td> + <input type="text" name="last_name" required></td></tr> + <tr><th>Birthday:</th><td> + <input type="text" name="birthday" required></td></tr> + """, ) # Instances of a dynamic Form do not persist fields from one Form instance to @@ -1601,15 +1688,19 @@ value="Should escape < & > and <script>alert('xss')< my_form = MyForm(field_list=field_list) self.assertHTMLEqual( my_form.as_table(), - """<tr><th>Field1:</th><td><input type="text" name="field1" required></td></tr> -<tr><th>Field2:</th><td><input type="text" name="field2" required></td></tr>""", + """ + <tr><th>Field1:</th><td><input type="text" name="field1" required></td></tr> + <tr><th>Field2:</th><td><input type="text" name="field2" required></td></tr> + """, ) field_list = [("field3", CharField()), ("field4", CharField())] my_form = MyForm(field_list=field_list) self.assertHTMLEqual( my_form.as_table(), - """<tr><th>Field3:</th><td><input type="text" name="field3" required></td></tr> -<tr><th>Field4:</th><td><input type="text" name="field4" required></td></tr>""", + """ + <tr><th>Field3:</th><td><input type="text" name="field3" required></td></tr> + <tr><th>Field4:</th><td><input type="text" name="field4" required></td></tr> + """, ) class MyForm(Form): @@ -1626,19 +1717,27 @@ value="Should escape < & > and <script>alert('xss')< my_form = MyForm(field_list=field_list) self.assertHTMLEqual( my_form.as_table(), - """<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" required></td></tr> -<tr><th>Default field 2:</th><td><input type="text" name="default_field_2" required></td></tr> -<tr><th>Field1:</th><td><input type="text" name="field1" required></td></tr> -<tr><th>Field2:</th><td><input type="text" name="field2" required></td></tr>""", + """ + <tr><th>Default field 1:</th><td> + <input type="text" name="default_field_1" required></td></tr> + <tr><th>Default field 2:</th><td> + <input type="text" name="default_field_2" required></td></tr> + <tr><th>Field1:</th><td><input type="text" name="field1" required></td></tr> + <tr><th>Field2:</th><td><input type="text" name="field2" required></td></tr> + """, ) field_list = [("field3", CharField()), ("field4", CharField())] my_form = MyForm(field_list=field_list) self.assertHTMLEqual( my_form.as_table(), - """<tr><th>Default field 1:</th><td><input type="text" name="default_field_1" required></td></tr> -<tr><th>Default field 2:</th><td><input type="text" name="default_field_2" required></td></tr> -<tr><th>Field3:</th><td><input type="text" name="field3" required></td></tr> -<tr><th>Field4:</th><td><input type="text" name="field4" required></td></tr>""", + """ + <tr><th>Default field 1:</th><td> + <input type="text" name="default_field_1" required></td></tr> + <tr><th>Default field 2:</th><td> + <input type="text" name="default_field_2" required></td></tr> + <tr><th>Field3:</th><td><input type="text" name="field3" required></td></tr> + <tr><th>Field4:</th><td><input type="text" name="field4" required></td></tr> + """, ) # Similarly, changes to field attributes do not persist from one Form instance @@ -1766,22 +1865,33 @@ value="Should escape < & > and <script>alert('xss')< p = Person(auto_id=False) self.assertHTMLEqual( p.as_table(), - """<tr><th>First name:</th><td><input type="text" name="first_name" required></td></tr> -<tr><th>Last name:</th><td><input type="text" name="last_name" required></td></tr> -<tr><th>Birthday:</th> -<td><input type="text" name="birthday" required><input type="hidden" name="hidden_text"></td></tr>""", + """ + <tr><th>First name:</th><td><input type="text" name="first_name" required> + </td></tr> + <tr><th>Last name:</th><td><input type="text" name="last_name" required> + </td></tr> + <tr><th>Birthday:</th> + <td><input type="text" name="birthday" required> + <input type="hidden" name="hidden_text"></td></tr> + """, ) self.assertHTMLEqual( p.as_ul(), - """<li>First name: <input type="text" name="first_name" required></li> -<li>Last name: <input type="text" name="last_name" required></li> -<li>Birthday: <input type="text" name="birthday" required><input type="hidden" name="hidden_text"></li>""", + """ + <li>First name: <input type="text" name="first_name" required></li> + <li>Last name: <input type="text" name="last_name" required></li> + <li>Birthday: <input type="text" name="birthday" required> + <input type="hidden" name="hidden_text"></li> + """, ) self.assertHTMLEqual( p.as_p(), - """<p>First name: <input type="text" name="first_name" required></p> -<p>Last name: <input type="text" name="last_name" required></p> -<p>Birthday: <input type="text" name="birthday" required><input type="hidden" name="hidden_text"></p>""", + """ + <p>First name: <input type="text" name="first_name" required></p> + <p>Last name: <input type="text" name="last_name" required></p> + <p>Birthday: <input type="text" name="birthday" required> + <input type="hidden" name="hidden_text"></p> + """, ) # With auto_id set, a HiddenInput still gets an ID, but it doesn't get a label. @@ -1827,28 +1937,44 @@ value="Should escape < & > and <script>alert('xss')< ) self.assertHTMLEqual( p.as_table(), - """<tr><td colspan="2"> -<ul class="errorlist nonfield"><li>(Hidden field hidden_text) This field is required.</li></ul></td></tr> -<tr><th>First name:</th><td><input type="text" name="first_name" value="John" required></td></tr> -<tr><th>Last name:</th><td><input type="text" name="last_name" value="Lennon" required></td></tr> -<tr><th>Birthday:</th><td><input type="text" name="birthday" value="1940-10-9" required> -<input type="hidden" name="hidden_text"></td></tr>""", + """ + <tr><td colspan="2"> + <ul class="errorlist nonfield"><li> + (Hidden field hidden_text) This field is required.</li></ul></td></tr> + <tr><th>First name:</th><td> + <input type="text" name="first_name" value="John" required></td></tr> + <tr><th>Last name:</th><td> + <input type="text" name="last_name" value="Lennon" required></td></tr> + <tr><th>Birthday:</th><td> + <input type="text" name="birthday" value="1940-10-9" required> + <input type="hidden" name="hidden_text"></td></tr> + """, ) self.assertHTMLEqual( p.as_ul(), - """<li><ul class="errorlist nonfield"><li>(Hidden field hidden_text) This field is required.</li></ul></li> -<li>First name: <input type="text" name="first_name" value="John" required></li> -<li>Last name: <input type="text" name="last_name" value="Lennon" required></li> -<li>Birthday: <input type="text" name="birthday" value="1940-10-9" required> -<input type="hidden" name="hidden_text"></li>""", + """ + <li><ul class="errorlist nonfield"><li> + (Hidden field hidden_text) This field is required.</li></ul></li> + <li>First name: <input type="text" name="first_name" value="John" required> + </li> + <li>Last name: <input type="text" name="last_name" value="Lennon" required> + </li> + <li>Birthday: <input type="text" name="birthday" value="1940-10-9" required> + <input type="hidden" name="hidden_text"></li> + """, ) self.assertHTMLEqual( p.as_p(), - """<ul class="errorlist nonfield"><li>(Hidden field hidden_text) This field is required.</li></ul> -<p>First name: <input type="text" name="first_name" value="John" required></p> -<p>Last name: <input type="text" name="last_name" value="Lennon" required></p> -<p>Birthday: <input type="text" name="birthday" value="1940-10-9" required> -<input type="hidden" name="hidden_text"></p>""", + """ + <ul class="errorlist nonfield"><li> + (Hidden field hidden_text) This field is required.</li></ul> + <p>First name: <input type="text" name="first_name" value="John" required> + </p> + <p>Last name: <input type="text" name="last_name" value="Lennon" required> + </p> + <p>Birthday: <input type="text" name="birthday" value="1940-10-9" required> + <input type="hidden" name="hidden_text"></p> + """, ) # A corner case: It's possible for a form to have only HiddenInputs. @@ -1890,20 +2016,11 @@ value="Should escape < & > and <script>alert('xss')< p = TestForm(auto_id=False) self.assertHTMLEqual( p.as_table(), - """<tr><th>Field1:</th><td><input type="text" name="field1" required></td></tr> -<tr><th>Field2:</th><td><input type="text" name="field2" required></td></tr> -<tr><th>Field3:</th><td><input type="text" name="field3" required></td></tr> -<tr><th>Field4:</th><td><input type="text" name="field4" required></td></tr> -<tr><th>Field5:</th><td><input type="text" name="field5" required></td></tr> -<tr><th>Field6:</th><td><input type="text" name="field6" required></td></tr> -<tr><th>Field7:</th><td><input type="text" name="field7" required></td></tr> -<tr><th>Field8:</th><td><input type="text" name="field8" required></td></tr> -<tr><th>Field9:</th><td><input type="text" name="field9" required></td></tr> -<tr><th>Field10:</th><td><input type="text" name="field10" required></td></tr> -<tr><th>Field11:</th><td><input type="text" name="field11" required></td></tr> -<tr><th>Field12:</th><td><input type="text" name="field12" required></td></tr> -<tr><th>Field13:</th><td><input type="text" name="field13" required></td></tr> -<tr><th>Field14:</th><td><input type="text" name="field14" required></td></tr>""", + "".join( + f"<tr><th>Field{i}:</th><td>" + f'<input type="text" name="field{i}" required></td></tr>' + for i in range(1, 15) + ), ) def test_explicit_field_order(self): @@ -1967,15 +2084,20 @@ value="Should escape < & > and <script>alert('xss')< p = UserRegistration(auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" maxlength="10" required></li> -<li>Password: <input type="password" name="password" maxlength="10" required></li> -<li>Realname: <input type="text" name="realname" maxlength="10" required></li> -<li>Address: <input type="text" name="address" required></li>""", + """ + <li>Username: <input type="text" name="username" maxlength="10" required> + </li> + <li>Password: <input type="password" name="password" maxlength="10" + required></li> + <li>Realname: <input type="text" name="realname" maxlength="10" required> + </li> + <li>Address: <input type="text" name="address" required></li> + """, ) - # If you specify a custom "attrs" that includes the "maxlength" attribute, - # the Field's max_length attribute will override whatever "maxlength" you specify - # in "attrs". + # If you specify a custom "attrs" that includes the "maxlength" + # attribute, the Field's max_length attribute will override whatever + # "maxlength" you specify in "attrs". class UserRegistration(Form): username = CharField( max_length=10, widget=TextInput(attrs={"maxlength": 20}) @@ -2001,9 +2123,13 @@ value="Should escape < & > and <script>alert('xss')< p = UserRegistration(auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Your username: <input type="text" name="username" maxlength="10" required></li> -<li>Password1: <input type="password" name="password1" required></li> -<li>Contraseña (de nuevo): <input type="password" name="password2" required></li>""", + """ + <li>Your username: + <input type="text" name="username" maxlength="10" required></li> + <li>Password1: <input type="password" name="password1" required></li> + <li>Contraseña (de nuevo): + <input type="password" name="password2" required></li> + """, ) # Labels for as_* methods will only end in a colon if they don't end in other @@ -2025,14 +2151,22 @@ value="Should escape < & > and <script>alert('xss')< ) self.assertHTMLEqual( Questions().as_p(), - """<p><label for="id_q1">The first question:</label> <input type="text" name="q1" id="id_q1" required></p> -<p><label for="id_q2">What is your name?</label> <input type="text" name="q2" id="id_q2" required></p> -<p><label for="id_q3">The answer to life is:</label> <input type="text" name="q3" id="id_q3" required></p> -<p><label for="id_q4">Answer this question!</label> <input type="text" name="q4" id="id_q4" required></p> -<p><label for="id_q5">The last question. Period.</label> <input type="text" name="q5" id="id_q5" required></p>""", + """ + <p><label for="id_q1">The first question:</label> + <input type="text" name="q1" id="id_q1" required></p> + <p><label for="id_q2">What is your name?</label> + <input type="text" name="q2" id="id_q2" required></p> + <p><label for="id_q3">The answer to life is:</label> + <input type="text" name="q3" id="id_q3" required></p> + <p><label for="id_q4">Answer this question!</label> + <input type="text" name="q4" id="id_q4" required></p> + <p><label for="id_q5">The last question. Period.</label> + <input type="text" name="q5" id="id_q5" required></p> + """, ) - # If a label is set to the empty string for a field, that field won't get a label. + # If a label is set to the empty string for a field, that field won't + # get a label. class UserRegistration(Form): username = CharField(max_length=10, label="") password = CharField(widget=PasswordInput) @@ -2046,9 +2180,13 @@ value="Should escape < & > and <script>alert('xss')< p = UserRegistration(auto_id="id_%s") self.assertHTMLEqual( p.as_ul(), - """<li> <input id="id_username" type="text" name="username" maxlength="10" required></li> -<li><label for="id_password">Password:</label> -<input type="password" name="password" id="id_password" required></li>""", + """ + <li> + <input id="id_username" type="text" name="username" maxlength="10" required> + </li> + <li><label for="id_password">Password:</label> + <input type="password" name="password" id="id_password" required></li> + """, ) # If label is None, Django will auto-create the label from the field name. This @@ -2073,11 +2211,12 @@ value="Should escape < & > and <script>alert('xss')< ) def test_label_suffix(self): - # You can specify the 'label_suffix' argument to a Form class to modify the - # punctuation symbol used at the end of a label. By default, the colon (:) is - # used, and is only appended to the label if the label doesn't already end with a - # punctuation symbol: ., !, ? or :. If you specify a different suffix, it will - # be appended regardless of the last character of the label. + # You can specify the 'label_suffix' argument to a Form class to modify + # the punctuation symbol used at the end of a label. By default, the + # colon (:) is used, and is only appended to the label if the label + # doesn't already end with a punctuation symbol: ., !, ? or :. If you + # specify a different suffix, it will be appended regardless of the + # last character of the label. class FavoriteForm(Form): color = CharField(label="Favorite color?") animal = CharField(label="Favorite animal") @@ -2111,7 +2250,8 @@ value="Should escape < & > and <script>alert('xss')< self.assertHTMLEqual( f.as_ul(), '<li>Favorite color? <input type="text" name="color" required></li>\n' - '<li>Favorite animal\u2192 <input type="text" name="animal" required></li>\n' + "<li>Favorite animal\u2192 " + '<input type="text" name="animal" required></li>\n' '<li>Secret answer = <input type="text" name="answer" required></li>', ) @@ -2129,8 +2269,11 @@ value="Should escape < & > and <script>alert('xss')< p = UserRegistration(auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="django" maxlength="10" required></li> -<li>Password: <input type="password" name="password" required></li>""", + """ + <li>Username: <input type="text" name="username" value="django" + maxlength="10" required></li> + <li>Password: <input type="password" name="password" required></li> + """, ) # Here, we're submitting data, so the initial value will *not* be displayed. @@ -2153,14 +2296,18 @@ Password: <input type="password" name="password" required></li>""", p = UserRegistration({"username": "foo"}, auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="foo" maxlength="10" required></li> -<li><ul class="errorlist"><li>This field is required.</li></ul> -Password: <input type="password" name="password" required></li>""", + """ + <li>Username: <input type="text" name="username" value="foo" maxlength="10" + required></li> + <li><ul class="errorlist"><li>This field is required.</li></ul> + Password: <input type="password" name="password" required></li> + """, ) - # An 'initial' value is *not* used as a fallback if data is not provided. In this - # example, we don't provide a value for 'username', and the form raises a - # validation error rather than using the initial value for 'username'. + # An 'initial' value is *not* used as a fallback if data is not + # provided. In this example, we don't provide a value for 'username', + # and the form raises a validation error rather than using the initial + # value for 'username'. p = UserRegistration({"password": "secret"}) self.assertEqual(p.errors["username"], ["This field is required."]) self.assertFalse(p.is_valid()) @@ -2179,14 +2326,20 @@ Password: <input type="password" name="password" required></li>""", p = UserRegistration(initial={"username": "django"}, auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="django" maxlength="10" required></li> -<li>Password: <input type="password" name="password" required></li>""", + """ + <li>Username: <input type="text" name="username" value="django" + maxlength="10" required></li> + <li>Password: <input type="password" name="password" required></li> + """, ) p = UserRegistration(initial={"username": "stephane"}, auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="stephane" maxlength="10" required></li> -<li>Password: <input type="password" name="password" required></li>""", + """ + <li>Username: <input type="text" name="username" value="stephane" + maxlength="10" required></li> + <li>Password: <input type="password" name="password" required></li> + """, ) # The 'initial' parameter is meaningless if you pass data. @@ -2213,20 +2366,24 @@ Password: <input type="password" name="password" required></li>""", ) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="foo" maxlength="10" required></li> -<li><ul class="errorlist"><li>This field is required.</li></ul> -Password: <input type="password" name="password" required></li>""", + """ + <li>Username: <input type="text" name="username" value="foo" maxlength="10" + required></li> + <li><ul class="errorlist"><li>This field is required.</li></ul> + Password: <input type="password" name="password" required></li> + """, ) # A dynamic 'initial' value is *not* used as a fallback if data is not provided. - # In this example, we don't provide a value for 'username', and the form raises a - # validation error rather than using the initial value for 'username'. + # In this example, we don't provide a value for 'username', and the + # form raises a validation error rather than using the initial value + # for 'username'. p = UserRegistration({"password": "secret"}, initial={"username": "django"}) self.assertEqual(p.errors["username"], ["This field is required."]) self.assertFalse(p.is_valid()) - # If a Form defines 'initial' *and* 'initial' is passed as a parameter to Form(), - # then the latter will get precedence. + # If a Form defines 'initial' *and* 'initial' is passed as a parameter + # to Form(), then the latter will get precedence. class UserRegistration(Form): username = CharField(max_length=10, initial="django") password = CharField(widget=PasswordInput) @@ -2234,8 +2391,11 @@ Password: <input type="password" name="password" required></li>""", p = UserRegistration(initial={"username": "babik"}, auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="babik" maxlength="10" required></li> -<li>Password: <input type="password" name="password" required></li>""", + """ + <li>Username: <input type="text" name="username" value="babik" + maxlength="10" required></li> + <li>Password: <input type="password" name="password" required></li> + """, ) def test_callable_initial_data(self): @@ -2268,13 +2428,16 @@ Password: <input type="password" name="password" required></li>""", ) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="django" maxlength="10" required></li> -<li>Password: <input type="password" name="password" required></li> -<li>Options: <select multiple name="options" required> -<option value="f" selected>foo</option> -<option value="b" selected>bar</option> -<option value="w">whiz</option> -</select></li>""", + """ + <li>Username: <input type="text" name="username" value="django" + maxlength="10" required></li> + <li>Password: <input type="password" name="password" required></li> + <li>Options: <select multiple name="options" required> + <option value="f" selected>foo</option> + <option value="b" selected>bar</option> + <option value="w">whiz</option> + </select></li> + """, ) # The 'initial' parameter is meaningless if you pass data. @@ -2319,19 +2482,23 @@ Options: <select multiple name="options" required> ) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="foo" maxlength="10" required></li> -<li><ul class="errorlist"><li>This field is required.</li></ul> -Password: <input type="password" name="password" required></li> -<li>Options: <select multiple name="options" required> -<option value="f" selected>foo</option> -<option value="b" selected>bar</option> -<option value="w">whiz</option> -</select></li>""", + """ + <li>Username: <input type="text" name="username" value="foo" maxlength="10" + required></li> + <li><ul class="errorlist"><li>This field is required.</li></ul> + Password: <input type="password" name="password" required></li> + <li>Options: <select multiple name="options" required> + <option value="f" selected>foo</option> + <option value="b" selected>bar</option> + <option value="w">whiz</option> + </select></li> + """, ) - # A callable 'initial' value is *not* used as a fallback if data is not provided. - # In this example, we don't provide a value for 'username', and the form raises a - # validation error rather than using the initial value for 'username'. + # A callable 'initial' value is *not* used as a fallback if data is not + # provided. In this example, we don't provide a value for 'username', + # and the form raises a validation error rather than using the initial + # value for 'username'. p = UserRegistration( {"password": "secret"}, initial={"username": initial_django, "options": initial_options}, @@ -2339,8 +2506,8 @@ Password: <input type="password" name="password" required></li> self.assertEqual(p.errors["username"], ["This field is required."]) self.assertFalse(p.is_valid()) - # If a Form defines 'initial' *and* 'initial' is passed as a parameter to Form(), - # then the latter will get precedence. + # If a Form defines 'initial' *and* 'initial' is passed as a parameter + # to Form(), then the latter will get precedence. class UserRegistration(Form): username = CharField(max_length=10, initial=initial_django) password = CharField(widget=PasswordInput) @@ -2352,13 +2519,16 @@ Password: <input type="password" name="password" required></li> p = UserRegistration(auto_id=False) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="django" maxlength="10" required></li> -<li>Password: <input type="password" name="password" required></li> -<li>Options: <select multiple name="options" required> -<option value="f">foo</option> -<option value="b" selected>bar</option> -<option value="w" selected>whiz</option> -</select></li>""", + """ + <li>Username: <input type="text" name="username" value="django" + maxlength="10" required></li> + <li>Password: <input type="password" name="password" required></li> + <li>Options: <select multiple name="options" required> + <option value="f">foo</option> + <option value="b" selected>bar</option> + <option value="w" selected>whiz</option> + </select></li> + """, ) p = UserRegistration( initial={"username": initial_stephane, "options": initial_options}, @@ -2366,13 +2536,16 @@ Password: <input type="password" name="password" required></li> ) self.assertHTMLEqual( p.as_ul(), - """<li>Username: <input type="text" name="username" value="stephane" maxlength="10" required></li> -<li>Password: <input type="password" name="password" required></li> -<li>Options: <select multiple name="options" required> -<option value="f" selected>foo</option> -<option value="b" selected>bar</option> -<option value="w">whiz</option> -</select></li>""", + """ + <li>Username: <input type="text" name="username" value="stephane" + maxlength="10" required></li> + <li>Password: <input type="password" name="password" required></li> + <li>Options: <select multiple name="options" required> + <option value="f" selected>foo</option> + <option value="b" selected>bar</option> + <option value="w">whiz</option> + </select></li> + """, ) def test_get_initial_for_field(self): @@ -2605,7 +2778,8 @@ Password: <input type="password" name="password" required></li> self.assertEqual(form.changed_data, []) def test_help_text(self): - # You can specify descriptive text for a field by using the 'help_text' argument) + # You can specify descriptive text for a field by using the 'help_text' + # argument. class UserRegistration(Form): username = CharField(max_length=10, help_text="e.g., user@example.com") password = CharField( @@ -2629,10 +2803,13 @@ Password: <input type="password" name="password" required></li> ) self.assertHTMLEqual( p.as_table(), - """<tr><th>Username:</th><td><input type="text" name="username" maxlength="10" required><br> -<span class="helptext">e.g., user@example.com</span></td></tr> -<tr><th>Password:</th><td><input type="password" name="password" required><br> -<span class="helptext">Wählen Sie mit Bedacht.</span></td></tr>""", + """ + <tr><th>Username:</th><td> + <input type="text" name="username" maxlength="10" required><br> + <span class="helptext">e.g., user@example.com</span></td></tr> + <tr><th>Password:</th><td><input type="password" name="password" required> + <br> + <span class="helptext">Wählen Sie mit Bedacht.</span></td></tr>""", ) # The help text is displayed whether or not data is provided for the form. @@ -2752,13 +2929,14 @@ Password: <input type="password" name="password" required> ) def test_forms_with_prefixes(self): - # Sometimes it's necessary to have multiple forms display on the same HTML page, - # or multiple copies of the same form. We can accomplish this with form prefixes. - # Pass the keyword argument 'prefix' to the Form constructor to use this feature. - # This value will be prepended to each HTML form field name. One way to think - # about this is "namespaces for HTML forms". Notice that in the data argument, - # each field's key has the prefix, in this case 'person1', prepended to the - # actual field name. + # Sometimes it's necessary to have multiple forms display on the same + # HTML page, or multiple copies of the same form. We can accomplish + # this with form prefixes. Pass the keyword argument 'prefix' to the + # Form constructor to use this feature. This value will be prepended to + # each HTML form field name. One way to think about this is "namespaces + # for HTML forms". Notice that in the data argument, each field's key + # has the prefix, in this case 'person1', prepended to the actual field + # name. class Person(Form): first_name = CharField() last_name = CharField() @@ -2772,24 +2950,32 @@ Password: <input type="password" name="password" required> p = Person(data, prefix="person1") self.assertHTMLEqual( p.as_ul(), - """<li><label for="id_person1-first_name">First name:</label> -<input type="text" name="person1-first_name" value="John" id="id_person1-first_name" required></li> -<li><label for="id_person1-last_name">Last name:</label> -<input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" required></li> -<li><label for="id_person1-birthday">Birthday:</label> -<input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" required></li>""", + """ + <li><label for="id_person1-first_name">First name:</label> + <input type="text" name="person1-first_name" value="John" + id="id_person1-first_name" required></li> + <li><label for="id_person1-last_name">Last name:</label> + <input type="text" name="person1-last_name" value="Lennon" + id="id_person1-last_name" required></li> + <li><label for="id_person1-birthday">Birthday:</label> + <input type="text" name="person1-birthday" value="1940-10-9" + id="id_person1-birthday" required></li> + """, ) self.assertHTMLEqual( str(p["first_name"]), - '<input type="text" name="person1-first_name" value="John" id="id_person1-first_name" required>', + '<input type="text" name="person1-first_name" value="John" ' + 'id="id_person1-first_name" required>', ) self.assertHTMLEqual( str(p["last_name"]), - '<input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" required>', + '<input type="text" name="person1-last_name" value="Lennon" ' + 'id="id_person1-last_name" required>', ) self.assertHTMLEqual( str(p["birthday"]), - '<input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" required>', + '<input type="text" name="person1-birthday" value="1940-10-9" ' + 'id="id_person1-birthday" required>', ) self.assertEqual(p.errors, {}) self.assertTrue(p.is_valid()) @@ -2861,12 +3047,17 @@ Password: <input type="password" name="password" required> p = Person(prefix="foo") self.assertHTMLEqual( p.as_ul(), - """<li><label for="id_foo-prefix-first_name">First name:</label> -<input type="text" name="foo-prefix-first_name" id="id_foo-prefix-first_name" required></li> -<li><label for="id_foo-prefix-last_name">Last name:</label> -<input type="text" name="foo-prefix-last_name" id="id_foo-prefix-last_name" required></li> -<li><label for="id_foo-prefix-birthday">Birthday:</label> -<input type="text" name="foo-prefix-birthday" id="id_foo-prefix-birthday" required></li>""", + """ + <li><label for="id_foo-prefix-first_name">First name:</label> + <input type="text" name="foo-prefix-first_name" + id="id_foo-prefix-first_name" required></li> + <li><label for="id_foo-prefix-last_name">Last name:</label> + <input type="text" name="foo-prefix-last_name" id="id_foo-prefix-last_name" + required></li> + <li><label for="id_foo-prefix-birthday">Birthday:</label> + <input type="text" name="foo-prefix-birthday" id="id_foo-prefix-birthday" + required></li> + """, ) data = { "foo-prefix-first_name": "John", @@ -2981,15 +3172,16 @@ Password: <input type="password" name="password" required> ) def test_forms_with_file_fields(self): - # FileFields are a special case because they take their data from the request.FILES, - # not request.POST. + # FileFields are a special case because they take their data from the + # request.FILES, not request.POST. class FileForm(Form): file1 = FileField() f = FileForm(auto_id=False) self.assertHTMLEqual( f.as_table(), - '<tr><th>File1:</th><td><input type="file" name="file1" required></td></tr>', + "<tr><th>File1:</th><td>" + '<input type="file" name="file1" required></td></tr>', ) f = FileForm(data={}, files={}, auto_id=False) @@ -3028,7 +3220,8 @@ Password: <input type="password" name="password" required> ) self.assertHTMLEqual( f.as_table(), - '<tr><th>File1:</th><td><input type="file" name="file1" required></td></tr>', + "<tr><th>File1:</th><td>" + '<input type="file" name="file1" required></td></tr>', ) self.assertTrue(f.is_valid()) @@ -3038,7 +3231,8 @@ Password: <input type="password" name="password" required> f = FileForm(data={}, files={"file1": file1}, auto_id=False) self.assertHTMLEqual( f.as_table(), - '<tr><th>File1:</th><td><input type="file" name="file1" required></td></tr>', + "<tr><th>File1:</th><td>" + '<input type="file" name="file1" required></td></tr>', ) # A required file field with initial data should not contain the @@ -3158,9 +3352,10 @@ Password: <input type="password" name="password" required> self.assertHTMLEqual( MyForm().as_table(), - '<tr><th><label for="id_field1">Field1:</label></th>' - '<td><input id="id_field1" type="text" name="field1" maxlength="50" required>' - '<input type="hidden" name="initial-field1" id="initial-id_field1"></td></tr>', + '<tr><th><label for="id_field1">Field1:</label></th><td>' + '<input id="id_field1" type="text" name="field1" maxlength="50" required>' + '<input type="hidden" name="initial-field1" id="initial-id_field1">' + "</td></tr>", ) def test_error_html_required_html_classes(self): @@ -3176,34 +3371,46 @@ Password: <input type="password" name="password" required> self.assertHTMLEqual( p.as_ul(), - """<li class="required error"><ul class="errorlist"><li>This field is required.</li></ul> -<label class="required" for="id_name">Name:</label> <input type="text" name="name" id="id_name" required></li> -<li class="required"><label class="required" for="id_is_cool">Is cool:</label> -<select name="is_cool" id="id_is_cool"> -<option value="unknown" selected>Unknown</option> -<option value="true">Yes</option> -<option value="false">No</option> -</select></li> -<li><label for="id_email">Email:</label> <input type="email" name="email" id="id_email"></li> -<li class="required error"><ul class="errorlist"><li>This field is required.</li></ul> -<label class="required" for="id_age">Age:</label> <input type="number" name="age" id="id_age" required></li>""", + """ + <li class="required error"><ul class="errorlist"> + <li>This field is required.</li></ul> + <label class="required" for="id_name">Name:</label> + <input type="text" name="name" id="id_name" required></li> + <li class="required"> + <label class="required" for="id_is_cool">Is cool:</label> + <select name="is_cool" id="id_is_cool"> + <option value="unknown" selected>Unknown</option> + <option value="true">Yes</option> + <option value="false">No</option> + </select></li> + <li><label for="id_email">Email:</label> + <input type="email" name="email" id="id_email"></li> + <li class="required error"><ul class="errorlist"> + <li>This field is required.</li></ul> + <label class="required" for="id_age">Age:</label> + <input type="number" name="age" id="id_age" required></li>""", ) self.assertHTMLEqual( p.as_p(), - """<ul class="errorlist"><li>This field is required.</li></ul> -<p class="required error"><label class="required" for="id_name">Name:</label> -<input type="text" name="name" id="id_name" required></p> -<p class="required"><label class="required" for="id_is_cool">Is cool:</label> -<select name="is_cool" id="id_is_cool"> -<option value="unknown" selected>Unknown</option> -<option value="true">Yes</option> -<option value="false">No</option> -</select></p> -<p><label for="id_email">Email:</label> <input type="email" name="email" id="id_email"></p> -<ul class="errorlist"><li>This field is required.</li></ul> -<p class="required error"><label class="required" for="id_age">Age:</label> -<input type="number" name="age" id="id_age" required></p>""", + """ + <ul class="errorlist"><li>This field is required.</li></ul> + <p class="required error"> + <label class="required" for="id_name">Name:</label> + <input type="text" name="name" id="id_name" required></p> + <p class="required"> + <label class="required" for="id_is_cool">Is cool:</label> + <select name="is_cool" id="id_is_cool"> + <option value="unknown" selected>Unknown</option> + <option value="true">Yes</option> + <option value="false">No</option> + </select></p> + <p><label for="id_email">Email:</label> + <input type="email" name="email" id="id_email"></p> + <ul class="errorlist"><li>This field is required.</li></ul> + <p class="required error"><label class="required" for="id_age">Age:</label> + <input type="number" name="age" id="id_age" required></p> + """, ) self.assertHTMLEqual( @@ -3481,10 +3688,14 @@ Password: <input type="password" name="password" required> self.assertHTMLEqual( form.as_p(), """ - <p>Phone1:<input type="text" name="phone1_0" required><input type="text" name="phone1_1" required></p> - <p>Phone2:<input type="text" name="phone2_0"><input type="text" name="phone2_1"></p> - <p>Phone3:<input type="text" name="phone3_0" required><input type="text" name="phone3_1"></p> - <p>Phone4:<input type="text" name="phone4_0"><input type="text" name="phone4_1"></p> + <p>Phone1:<input type="text" name="phone1_0" required> + <input type="text" name="phone1_1" required></p> + <p>Phone2:<input type="text" name="phone2_0"> + <input type="text" name="phone2_1"></p> + <p>Phone3:<input type="text" name="phone3_0" required> + <input type="text" name="phone3_1"></p> + <p>Phone4:<input type="text" name="phone4_0"> + <input type="text" name="phone4_1"></p> """, ) @@ -3694,7 +3905,8 @@ Password: <input type="password" name="password" required> control = [ '<li>foo<ul class="errorlist"><li>This field is required.</li></ul></li>', '<li>bar<ul class="errorlist"><li>This field is required.</li></ul></li>', - '<li>__all__<ul class="errorlist nonfield"><li>Non-field error.</li></ul></li>', + '<li>__all__<ul class="errorlist nonfield"><li>Non-field error.</li></ul>' + "</li>", ] for error in control: self.assertInHTML(error, errors) @@ -3798,10 +4010,14 @@ Password: <input type="password" name="password" required> ) self.assertHTMLEqual( p.as_p(), - """<ul class="errorlist nonfield"><li>(Hidden field last_name) This field is required.</li></ul> -<p><label for="id_first_name">First name:</label> -<input id="id_first_name" name="first_name" type="text" value="John" required> -<input id="id_last_name" name="last_name" type="hidden"></p>""", + """ + <ul class="errorlist nonfield"> + <li>(Hidden field last_name) This field is required.</li></ul> + <p><label for="id_first_name">First name:</label> + <input id="id_first_name" name="first_name" type="text" value="John" + required> + <input id="id_last_name" name="last_name" type="hidden"></p> + """, ) self.assertHTMLEqual( p.as_table(), @@ -3847,11 +4063,18 @@ Password: <input type="password" name="password" required> ) self.assertHTMLEqual( p.as_table(), - """<tr><td colspan="2"><ul class="errorlist nonfield"><li>Generic validation error</li></ul></td></tr> -<tr><th><label for="id_first_name">First name:</label></th><td> -<input id="id_first_name" name="first_name" type="text" value="John" required></td></tr> -<tr><th><label for="id_last_name">Last name:</label></th><td> -<input id="id_last_name" name="last_name" type="text" value="Lennon" required></td></tr>""", + """ + <tr><td colspan="2"><ul class="errorlist nonfield"> + <li>Generic validation error</li></ul></td></tr> + <tr><th><label for="id_first_name">First name:</label></th><td> + <input id="id_first_name" name="first_name" type="text" value="John" + required> + </td></tr> + <tr><th><label for="id_last_name">Last name:</label></th><td> + <input id="id_last_name" name="last_name" type="text" value="Lennon" + required> + </td></tr> + """, ) def test_error_escaping(self): @@ -3868,7 +4091,8 @@ Password: <input type="password" name="password" required> form.is_valid() self.assertHTMLEqual( form.as_ul(), - '<li><ul class="errorlist nonfield"><li>(Hidden field hidden) Foo & "bar"!</li></ul></li>' + '<li><ul class="errorlist nonfield">' + "<li>(Hidden field hidden) Foo & "bar"!</li></ul></li>" '<li><ul class="errorlist"><li>Foo & "bar"!</li></ul>' '<label for="id_visible">Visible:</label> ' '<input type="text" name="visible" value="b" id="id_visible" required>' @@ -3883,14 +4107,16 @@ Password: <input type="password" name="password" required> p = Person() self.assertEqual( repr(p), - "<Person bound=False, valid=Unknown, fields=(first_name;last_name;birthday)>", + "<Person bound=False, valid=Unknown, " + "fields=(first_name;last_name;birthday)>", ) p = Person( {"first_name": "John", "last_name": "Lennon", "birthday": "1940-10-9"} ) self.assertEqual( repr(p), - "<Person bound=True, valid=Unknown, fields=(first_name;last_name;birthday)>", + "<Person bound=True, valid=Unknown, " + "fields=(first_name;last_name;birthday)>", ) p.is_valid() self.assertEqual( @@ -4003,9 +4229,12 @@ Password: <input type="password" name="password" required> form = MyForm() self.assertHTMLEqual( form.as_p(), - '<p><label for="id_f1">F1:</label> <input id="id_f1" maxlength="30" name="f1" type="text" required></p>' - '<p><label for="id_f2">F2:</label> <input id="id_f2" maxlength="30" name="f2" type="text"></p>' - '<p><label for="id_f3">F3:</label> <textarea cols="40" id="id_f3" name="f3" rows="10" required>' + '<p><label for="id_f1">F1:</label>' + '<input id="id_f1" maxlength="30" name="f1" type="text" required></p>' + '<p><label for="id_f2">F2:</label>' + '<input id="id_f2" maxlength="30" name="f2" type="text"></p>' + '<p><label for="id_f3">F3:</label>' + '<textarea cols="40" id="id_f3" name="f3" rows="10" required>' "</textarea></p>" '<p><label for="id_f4">F4:</label> <select id="id_f4" name="f4">' '<option value="P">Python</option>' @@ -4016,8 +4245,10 @@ Password: <input type="password" name="password" required> form.as_ul(), '<li><label for="id_f1">F1:</label> ' '<input id="id_f1" maxlength="30" name="f1" type="text" required></li>' - '<li><label for="id_f2">F2:</label> <input id="id_f2" maxlength="30" name="f2" type="text"></li>' - '<li><label for="id_f3">F3:</label> <textarea cols="40" id="id_f3" name="f3" rows="10" required>' + '<li><label for="id_f2">F2:</label>' + '<input id="id_f2" maxlength="30" name="f2" type="text"></li>' + '<li><label for="id_f3">F3:</label>' + '<textarea cols="40" id="id_f3" name="f3" rows="10" required>' "</textarea></li>" '<li><label for="id_f4">F4:</label> <select id="id_f4" name="f4">' '<option value="P">Python</option>' @@ -4027,13 +4258,15 @@ Password: <input type="password" name="password" required> self.assertHTMLEqual( form.as_table(), '<tr><th><label for="id_f1">F1:</label></th>' - '<td><input id="id_f1" maxlength="30" name="f1" type="text" required></td></tr>' + '<td><input id="id_f1" maxlength="30" name="f1" type="text" required>' + "</td></tr>" '<tr><th><label for="id_f2">F2:</label></th>' '<td><input id="id_f2" maxlength="30" name="f2" type="text"></td></tr>' '<tr><th><label for="id_f3">F3:</label></th>' '<td><textarea cols="40" id="id_f3" name="f3" rows="10" required>' "</textarea></td></tr>" - '<tr><th><label for="id_f4">F4:</label></th><td><select id="id_f4" name="f4">' + '<tr><th><label for="id_f4">F4:</label></th><td>' + '<select id="id_f4" name="f4">' '<option value="P">Python</option>' '<option value="J">Java</option>' "</select></td></tr>", @@ -4050,10 +4283,12 @@ Password: <input type="password" name="password" required> form = MyForm() self.assertHTMLEqual( form.as_p(), - '<p><label for="id_f1">F1:</label> <input id="id_f1" maxlength="30" name="f1" type="text"></p>' - '<p><label for="id_f2">F2:</label> <input id="id_f2" maxlength="30" name="f2" type="text"></p>' - '<p><label for="id_f3">F3:</label> <textarea cols="40" id="id_f3" name="f3" rows="10">' - "</textarea></p>" + '<p><label for="id_f1">F1:</label>' + '<input id="id_f1" maxlength="30" name="f1" type="text"></p>' + '<p><label for="id_f2">F2:</label>' + '<input id="id_f2" maxlength="30" name="f2" type="text"></p>' + '<p><label for="id_f3">F3:</label>' + '<textarea cols="40" id="id_f3" name="f3" rows="10"></textarea></p>' '<p><label for="id_f4">F4:</label> <select id="id_f4" name="f4">' '<option value="P">Python</option>' '<option value="J">Java</option>' @@ -4061,10 +4296,12 @@ Password: <input type="password" name="password" required> ) self.assertHTMLEqual( form.as_ul(), - '<li><label for="id_f1">F1:</label> <input id="id_f1" maxlength="30" name="f1" type="text"></li>' - '<li><label for="id_f2">F2:</label> <input id="id_f2" maxlength="30" name="f2" type="text"></li>' - '<li><label for="id_f3">F3:</label> <textarea cols="40" id="id_f3" name="f3" rows="10">' - "</textarea></li>" + '<li><label for="id_f1">F1:</label>' + '<input id="id_f1" maxlength="30" name="f1" type="text"></li>' + '<li><label for="id_f2">F2:</label>' + '<input id="id_f2" maxlength="30" name="f2" type="text"></li>' + '<li><label for="id_f3">F3:</label>' + '<textarea cols="40" id="id_f3" name="f3" rows="10"></textarea></li>' '<li><label for="id_f4">F4:</label> <select id="id_f4" name="f4">' '<option value="P">Python</option>' '<option value="J">Java</option>' @@ -4076,9 +4313,11 @@ Password: <input type="password" name="password" required> '<td><input id="id_f1" maxlength="30" name="f1" type="text"></td></tr>' '<tr><th><label for="id_f2">F2:</label></th>' '<td><input id="id_f2" maxlength="30" name="f2" type="text"></td></tr>' - '<tr><th><label for="id_f3">F3:</label></th><td><textarea cols="40" id="id_f3" name="f3" rows="10">' + '<tr><th><label for="id_f3">F3:</label></th><td>' + '<textarea cols="40" id="id_f3" name="f3" rows="10">' "</textarea></td></tr>" - '<tr><th><label for="id_f4">F4:</label></th><td><select id="id_f4" name="f4">' + '<tr><th><label for="id_f4">F4:</label></th><td>' + '<select id="id_f4" name="f4">' '<option value="P">Python</option>' '<option value="J">Java</option>' "</select></td></tr>", diff --git a/tests/forms_tests/tests/test_formsets.py b/tests/forms_tests/tests/test_formsets.py index 9846cb5874..87084102a5 100644 --- a/tests/forms_tests/tests/test_formsets.py +++ b/tests/forms_tests/tests/test_formsets.py @@ -657,7 +657,8 @@ class FormsFormsetTestCase(SimpleTestCase): def test_formsets_with_ordering(self): """ formset_factory's can_order argument adds an integer field to each - form. When form validation succeeds, [form.cleaned_data for form in formset.forms] + form. When form validation succeeds, + [form.cleaned_data for form in formset.forms] will have the data in the correct order specified by the ordering fields. If a number is duplicated in the set of ordering fields, for instance form 0 and form 3 are both marked as 1, then the form index @@ -959,10 +960,13 @@ class FormsFormsetTestCase(SimpleTestCase): formset = LimitedFavoriteDrinkFormSet(initial=[{"name": "Fernet and Coke"}]) self.assertHTMLEqual( "\n".join(str(form) for form in formset.forms), - """<tr><th><label for="id_form-0-name">Name:</label></th> -<td><input type="text" name="form-0-name" value="Fernet and Coke" id="id_form-0-name"></td></tr> -<tr><th><label for="id_form-1-name">Name:</label></th> -<td><input type="text" name="form-1-name" id="id_form-1-name"></td></tr>""", + """ + <tr><th><label for="id_form-0-name">Name:</label></th> + <td><input type="text" name="form-0-name" value="Fernet and Coke" + id="id_form-0-name"></td></tr> + <tr><th><label for="id_form-1-name">Name:</label></th> + <td><input type="text" name="form-1-name" id="id_form-1-name"></td></tr> + """, ) def test_max_num_zero(self): @@ -988,10 +992,14 @@ class FormsFormsetTestCase(SimpleTestCase): formset = LimitedFavoriteDrinkFormSet(initial=initial) self.assertHTMLEqual( "\n".join(str(form) for form in formset.forms), - """<tr><th><label for="id_form-0-name">Name:</label></th> -<td><input id="id_form-0-name" name="form-0-name" type="text" value="Fernet and Coke"></td></tr> -<tr><th><label for="id_form-1-name">Name:</label></th> -<td><input id="id_form-1-name" name="form-1-name" type="text" value="Bloody Mary"></td></tr>""", + """ + <tr><th><label for="id_form-0-name">Name:</label></th> + <td><input id="id_form-0-name" name="form-0-name" type="text" + value="Fernet and Coke"></td></tr> + <tr><th><label for="id_form-1-name">Name:</label></th> + <td><input id="id_form-1-name" name="form-1-name" type="text" + value="Bloody Mary"></td></tr> + """, ) def test_more_initial_than_max_num(self): @@ -1010,12 +1018,20 @@ class FormsFormsetTestCase(SimpleTestCase): formset = LimitedFavoriteDrinkFormSet(initial=initial) self.assertHTMLEqual( "\n".join(str(form) for form in formset.forms), - """<tr><th><label for="id_form-0-name">Name:</label></th> -<td><input id="id_form-0-name" name="form-0-name" type="text" value="Gin Tonic"></td></tr> -<tr><th><label for="id_form-1-name">Name:</label></th> -<td><input id="id_form-1-name" name="form-1-name" type="text" value="Bloody Mary"></td></tr> -<tr><th><label for="id_form-2-name">Name:</label></th> -<td><input id="id_form-2-name" name="form-2-name" type="text" value="Jack and Coke"></td></tr>""", + """ + <tr><th><label for="id_form-0-name">Name:</label></th> + <td> + <input id="id_form-0-name" name="form-0-name" type="text" value="Gin Tonic"> + </td></tr> + <tr><th><label for="id_form-1-name">Name:</label></th> + <td> + <input id="id_form-1-name" name="form-1-name" type="text" + value="Bloody Mary"></td></tr> + <tr><th><label for="id_form-2-name">Name:</label></th> + <td> + <input id="id_form-2-name" name="form-2-name" type="text" + value="Jack and Coke"></td></tr> + """, ) def test_default_absolute_max(self): @@ -1093,10 +1109,13 @@ class FormsFormsetTestCase(SimpleTestCase): formset = LimitedFavoriteDrinkFormSet(initial=[{"name": "Gin Tonic"}]) self.assertHTMLEqual( "\n".join(str(form) for form in formset.forms), - """<tr><th><label for="id_form-0-name">Name:</label></th> -<td><input type="text" name="form-0-name" value="Gin Tonic" id="id_form-0-name"></td></tr> -<tr><th><label for="id_form-1-name">Name:</label></th> -<td><input type="text" name="form-1-name" id="id_form-1-name"></td></tr>""", + """ + <tr><th><label for="id_form-0-name">Name:</label></th> + <td> + <input type="text" name="form-0-name" value="Gin Tonic" id="id_form-0-name"> + </td></tr> + <tr><th><label for="id_form-1-name">Name:</label></th> + <td><input type="text" name="form-1-name" id="id_form-1-name"></td></tr>""", ) def test_management_form_field_names(self): @@ -1539,7 +1558,8 @@ class FormsetAsTagTests(SimpleTestCase): self.formset.as_p(), self.management_form_html + ( - '<p>Choice: <input type="text" name="choices-0-choice" value="Calexico"></p>' + "<p>Choice: " + '<input type="text" name="choices-0-choice" value="Calexico"></p>' '<p>Votes: <input type="number" name="choices-0-votes" value="100"></p>' ), ) @@ -1549,8 +1569,10 @@ class FormsetAsTagTests(SimpleTestCase): self.formset.as_ul(), self.management_form_html + ( - '<li>Choice: <input type="text" name="choices-0-choice" value="Calexico"></li>' - '<li>Votes: <input type="number" name="choices-0-votes" value="100"></li>' + "<li>Choice: " + '<input type="text" name="choices-0-choice" value="Calexico"></li>' + "<li>Votes: " + '<input type="number" name="choices-0-votes" value="100"></li>' ), ) @@ -1620,8 +1642,10 @@ class TestIsBoundBehavior(SimpleTestCase): "<li>(Hidden field TOTAL_FORMS) Enter a whole number.</li>" "<li>(Hidden field INITIAL_FORMS) Enter a whole number.</li>" "</ul>" - '<input type="hidden" name="form-TOTAL_FORMS" value="two" id="id_form-TOTAL_FORMS">' - '<input type="hidden" name="form-INITIAL_FORMS" value="one" id="id_form-INITIAL_FORMS">' + '<input type="hidden" name="form-TOTAL_FORMS" value="two" ' + 'id="id_form-TOTAL_FORMS">' + '<input type="hidden" name="form-INITIAL_FORMS" value="one" ' + 'id="id_form-INITIAL_FORMS">' '<input type="hidden" name="form-MIN_NUM_FORMS" id="id_form-MIN_NUM_FORMS">' '<input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS">' "</td></tr>\n", diff --git a/tests/forms_tests/tests/test_i18n.py b/tests/forms_tests/tests/test_i18n.py index 777c84e4e4..2548ceb481 100644 --- a/tests/forms_tests/tests/test_i18n.py +++ b/tests/forms_tests/tests/test_i18n.py @@ -23,21 +23,25 @@ class FormsI18nTests(SimpleTestCase): self.assertHTMLEqual( f.as_p(), '<p><label for="id_username">username:</label>' - '<input id="id_username" type="text" name="username" maxlength="10" required></p>', + '<input id="id_username" type="text" name="username" maxlength="10" ' + "required></p>", ) - # Translations are done at rendering time, so multi-lingual apps can define forms) + # Translations are done at rendering time, so multi-lingual apps can + # define forms. with translation.override("de"): self.assertHTMLEqual( f.as_p(), '<p><label for="id_username">Benutzername:</label>' - '<input id="id_username" type="text" name="username" maxlength="10" required></p>', + '<input id="id_username" type="text" name="username" maxlength="10" ' + "required></p>", ) with translation.override("pl"): self.assertHTMLEqual( f.as_p(), '<p><label for="id_username">nazwa u\u017cytkownika:</label>' - '<input id="id_username" type="text" name="username" maxlength="10" required></p>', + '<input id="id_username" type="text" name="username" maxlength="10" ' + "required></p>", ) def test_non_ascii_label(self): @@ -79,13 +83,13 @@ class FormsI18nTests(SimpleTestCase): "<p><label>\xc5\xf8\xdf:</label>" '<div id="id_somechoice">\n' '<div><label for="id_somechoice_0">' - '<input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" required> ' - "En tied\xe4</label></div>\n" + '<input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" ' + "required> En tied\xe4</label></div>\n" '<div><label for="id_somechoice_1">' - '<input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" required> ' - 'Mies</label></div>\n<div><label for="id_somechoice_2">' - '<input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" required> ' - "Nainen</label></div>\n</div></p>", + '<input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" ' + 'required> Mies</label></div>\n<div><label for="id_somechoice_2">' + '<input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" ' + "required> Nainen</label></div>\n</div></p>", ) # Translated error messages @@ -98,13 +102,14 @@ class FormsI18nTests(SimpleTestCase): "\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.</li></ul>\n" "<p><label>\xc5\xf8\xdf:</label>" ' <div id="id_somechoice">\n<div><label for="id_somechoice_0">' - '<input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" required> ' - "En tied\xe4</label></div>\n" + '<input type="radio" id="id_somechoice_0" value="\xc5" ' + 'name="somechoice" required> En tied\xe4</label></div>\n' '<div><label for="id_somechoice_1">' - '<input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" required> ' - 'Mies</label></div>\n<div><label for="id_somechoice_2">' - '<input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" required> ' - "Nainen</label></div>\n</div></p>", + '<input type="radio" id="id_somechoice_1" value="\xf8" ' + 'name="somechoice" required> Mies</label></div>\n<div>' + '<label for="id_somechoice_2">' + '<input type="radio" id="id_somechoice_2" value="\xdf" ' + 'name="somechoice" required> Nainen</label></div>\n</div></p>', ) def test_select_translated_text(self): diff --git a/tests/forms_tests/tests/test_input_formats.py b/tests/forms_tests/tests/test_input_formats.py index 3ac28b1b30..cd3817d421 100644 --- a/tests/forms_tests/tests/test_input_formats.py +++ b/tests/forms_tests/tests/test_input_formats.py @@ -92,7 +92,10 @@ class LocalizedTimeTests(SimpleTestCase): self.assertEqual(text, "13:30:00") def test_localized_timeField_with_inputformat(self): - "Localized TimeFields with manually specified input formats can accept those formats" + """ + Localized TimeFields with manually specified input formats can accept + those formats. + """ f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"], localize=True) # Parse a time in an unaccepted format; get an error with self.assertRaises(ValidationError): @@ -192,7 +195,10 @@ class CustomTimeInputFormatsTests(SimpleTestCase): self.assertEqual(text, "01:30:00 PM") def test_localized_timeField_with_inputformat(self): - "Localized TimeFields with manually specified input formats can accept those formats" + """ + Localized TimeFields with manually specified input formats can accept + those formats. + """ f = forms.TimeField(input_formats=["%H.%M.%S", "%H.%M"], localize=True) # Parse a time in an unaccepted format; get an error with self.assertRaises(ValidationError): @@ -288,7 +294,10 @@ class SimpleTimeFormatTests(SimpleTestCase): self.assertEqual(text, "13:30:00") def test_localized_timeField_with_inputformat(self): - "Localized TimeFields with manually specified input formats can accept those formats" + """ + Localized TimeFields with manually specified input formats can accept + those formats. + """ f = forms.TimeField(input_formats=["%I:%M:%S %p", "%I:%M %p"], localize=True) # Parse a time in an unaccepted format; get an error with self.assertRaises(ValidationError): @@ -395,7 +404,10 @@ class LocalizedDateTests(SimpleTestCase): self.assertEqual(text, "21.12.2010") def test_localized_dateField_with_inputformat(self): - "Localized DateFields with manually specified input formats can accept those formats" + """ + Localized DateFields with manually specified input formats can accept + those formats. + """ f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"], localize=True) # Parse a date in an unaccepted format; get an error with self.assertRaises(ValidationError): @@ -497,7 +509,10 @@ class CustomDateInputFormatsTests(SimpleTestCase): self.assertEqual(text, "21.12.2010") def test_localized_dateField_with_inputformat(self): - "Localized DateFields with manually specified input formats can accept those formats" + """ + Localized DateFields with manually specified input formats can accept + those formats. + """ f = forms.DateField(input_formats=["%m.%d.%Y", "%m-%d-%Y"], localize=True) # Parse a date in an unaccepted format; get an error with self.assertRaises(ValidationError): @@ -593,7 +608,10 @@ class SimpleDateFormatTests(SimpleTestCase): self.assertEqual(text, "2010-12-21") def test_localized_dateField_with_inputformat(self): - "Localized DateFields with manually specified input formats can accept those formats" + """ + Localized DateFields with manually specified input formats can accept + those formats. + """ f = forms.DateField(input_formats=["%d.%m.%Y", "%d-%m-%Y"], localize=True) # Parse a date in an unaccepted format; get an error with self.assertRaises(ValidationError): @@ -702,7 +720,10 @@ class LocalizedDateTimeTests(SimpleTestCase): self.assertEqual(text, "21.12.2010 13:30:00") def test_localized_dateTimeField_with_inputformat(self): - "Localized DateTimeFields with manually specified input formats can accept those formats" + """ + Localized DateTimeFields with manually specified input formats can + accept those formats. + """ f = forms.DateTimeField( input_formats=["%H.%M.%S %m.%d.%Y", "%H.%M %m-%d-%Y"], localize=True ) @@ -810,7 +831,10 @@ class CustomDateTimeInputFormatsTests(SimpleTestCase): self.assertEqual(text, "01:30:00 PM 21/12/2010") def test_localized_dateTimeField_with_inputformat(self): - "Localized DateTimeFields with manually specified input formats can accept those formats" + """ + Localized DateTimeFields with manually specified input formats can + accept those formats. + """ f = forms.DateTimeField( input_formats=["%m.%d.%Y %H:%M:%S", "%m-%d-%Y %H:%M"], localize=True ) @@ -862,7 +886,10 @@ class SimpleDateTimeFormatTests(SimpleTestCase): self.assertEqual(text, "2010-12-21 13:30:05") def test_localized_dateTimeField(self): - "Localized DateTimeFields in a non-localized environment act as unlocalized widgets" + """ + Localized DateTimeFields in a non-localized environment act as + unlocalized widgets. + """ f = forms.DateTimeField() # Parse a date in an unaccepted format; get an error with self.assertRaises(ValidationError): @@ -910,7 +937,10 @@ class SimpleDateTimeFormatTests(SimpleTestCase): self.assertEqual(text, "2010-12-21 13:30:00") def test_localized_dateTimeField_with_inputformat(self): - "Localized DateTimeFields with manually specified input formats can accept those formats" + """ + Localized DateTimeFields with manually specified input formats can + accept those formats. + """ f = forms.DateTimeField( input_formats=["%I:%M:%S %p %d.%m.%Y", "%I:%M %p %d-%m-%Y"], localize=True ) diff --git a/tests/forms_tests/tests/test_media.py b/tests/forms_tests/tests/test_media.py index 59fd74f4c9..4338321af8 100644 --- a/tests/forms_tests/tests/test_media.py +++ b/tests/forms_tests/tests/test_media.py @@ -21,16 +21,18 @@ class FormsMediaTestCase(SimpleTestCase): ) self.assertEqual( str(m), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) self.assertEqual( repr(m), "Media(css={'all': ['path/to/css1', '/path/to/css2']}, " - "js=['/path/to/js1', 'http://media.other.com/path/to/js2', 'https://secure.other.com/path/to/js3'])", + "js=['/path/to/js1', 'http://media.other.com/path/to/js2', " + "'https://secure.other.com/path/to/js3'])", ) class Foo: @@ -44,11 +46,12 @@ class FormsMediaTestCase(SimpleTestCase): m3 = Media(Foo) self.assertEqual( str(m3), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) # A widget can exist without a media definition @@ -78,18 +81,20 @@ class FormsMediaTestCase(SimpleTestCase): w1 = MyWidget1() self.assertEqual( str(w1.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) # Media objects can be interrogated by media type self.assertEqual( str(w1.media["css"]), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet">""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">', ) self.assertEqual( @@ -126,23 +131,25 @@ class FormsMediaTestCase(SimpleTestCase): w3 = MyWidget3() self.assertEqual( str(w1.media + w2.media + w3.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<link href="/path/to/css3" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="/path/to/js4"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<link href="/path/to/css3" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="/path/to/js4"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) # media addition hasn't affected the original objects self.assertEqual( str(w1.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) # Regression check for #12879: specifying the same CSS or JS file @@ -234,13 +241,14 @@ class FormsMediaTestCase(SimpleTestCase): w6 = MyWidget6() self.assertEqual( str(w6.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/other/path" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="/other/js"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/other/path" media="all" rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="/other/js"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) def test_media_inheritance(self): @@ -248,7 +256,8 @@ class FormsMediaTestCase(SimpleTestCase): # Inheritance of media ############################################################### - # If a widget extends another but provides no media definition, it inherits the parent widget's media + # If a widget extends another but provides no media definition, it + # inherits the parent widget's media. class MyWidget1(TextInput): class Media: css = {"all": ("path/to/css1", "/path/to/css2")} @@ -264,14 +273,16 @@ class FormsMediaTestCase(SimpleTestCase): w7 = MyWidget7() self.assertEqual( str(w7.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) - # If a widget extends another but defines media, it extends the parent widget's media by default + # If a widget extends another but defines media, it extends the parent + # widget's media by default. class MyWidget8(MyWidget1): class Media: css = {"all": ("/path/to/css3", "path/to/css1")} @@ -290,8 +301,8 @@ class FormsMediaTestCase(SimpleTestCase): ) def test_media_inheritance_from_property(self): - # If a widget extends another but defines media, it extends the parents widget's media, - # even if the parent defined media using a property. + # If a widget extends another but defines media, it extends the parents + # widget's media, even if the parent defined media using a property. class MyWidget1(TextInput): class Media: css = {"all": ("path/to/css1", "/path/to/css2")} @@ -338,7 +349,8 @@ class FormsMediaTestCase(SimpleTestCase): ) def test_media_inheritance_extends(self): - # A widget can explicitly enable full media inheritance by specifying 'extend=True' + # A widget can explicitly enable full media inheritance by specifying + # 'extend=True'. class MyWidget1(TextInput): class Media: css = {"all": ("path/to/css1", "/path/to/css2")} @@ -367,7 +379,8 @@ class FormsMediaTestCase(SimpleTestCase): ) def test_media_inheritance_single_type(self): - # A widget can enable inheritance of one media type by specifying extend as a tuple + # A widget can enable inheritance of one media type by specifying + # extend as a tuple. class MyWidget1(TextInput): class Media: css = {"all": ("path/to/css1", "/path/to/css2")} @@ -453,13 +466,14 @@ class FormsMediaTestCase(SimpleTestCase): mymulti = MyMultiWidget() self.assertEqual( str(mymulti.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<link href="/path/to/css3" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="/path/to/js4"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<link href="/path/to/css3" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="/path/to/js4"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) def test_form_media(self): @@ -494,13 +508,14 @@ class FormsMediaTestCase(SimpleTestCase): f1 = MyForm() self.assertEqual( str(f1.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<link href="/path/to/css3" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="/path/to/js4"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<link href="/path/to/css3" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="/path/to/js4"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) # Form media can be combined to produce a single media definition. @@ -510,13 +525,14 @@ class FormsMediaTestCase(SimpleTestCase): f2 = AnotherForm() self.assertEqual( str(f1.media + f2.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<link href="/path/to/css3" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="/path/to/js4"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<link href="/path/to/css3" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="/path/to/js4"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) # Forms can also define media, following the same rules as widgets. @@ -531,15 +547,16 @@ class FormsMediaTestCase(SimpleTestCase): f3 = FormWithMedia() self.assertEqual( str(f3.media), - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/some/form/css" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<link href="/path/to/css3" media="all" rel="stylesheet"> -<script src="/path/to/js1"></script> -<script src="/some/form/javascript"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="/path/to/js4"></script> -<script src="https://secure.other.com/path/to/js3"></script>""", + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/some/form/css" media="all" rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<link href="/path/to/css3" media="all" rel="stylesheet">\n' + '<script src="/path/to/js1"></script>\n' + '<script src="/some/form/javascript"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="/path/to/js4"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>', ) # Media works in templates @@ -547,15 +564,16 @@ class FormsMediaTestCase(SimpleTestCase): Template("{{ form.media.js }}{{ form.media.css }}").render( Context({"form": f3}) ), - """<script src="/path/to/js1"></script> -<script src="/some/form/javascript"></script> -<script src="http://media.other.com/path/to/js2"></script> -<script src="/path/to/js4"></script> -<script src="https://secure.other.com/path/to/js3"></script>""" - """<link href="http://media.example.com/static/path/to/css1" media="all" rel="stylesheet"> -<link href="/some/form/css" media="all" rel="stylesheet"> -<link href="/path/to/css2" media="all" rel="stylesheet"> -<link href="/path/to/css3" media="all" rel="stylesheet">""", + '<script src="/path/to/js1"></script>\n' + '<script src="/some/form/javascript"></script>\n' + '<script src="http://media.other.com/path/to/js2"></script>\n' + '<script src="/path/to/js4"></script>\n' + '<script src="https://secure.other.com/path/to/js3"></script>' + '<link href="http://media.example.com/static/path/to/css1" media="all" ' + 'rel="stylesheet">\n' + '<link href="/some/form/css" media="all" rel="stylesheet">\n' + '<link href="/path/to/css2" media="all" rel="stylesheet">\n' + '<link href="/path/to/css3" media="all" rel="stylesheet">', ) def test_html_safe(self): diff --git a/tests/forms_tests/tests/test_utils.py b/tests/forms_tests/tests/test_utils.py index c4a2e5c651..a921a924b6 100644 --- a/tests/forms_tests/tests/test_utils.py +++ b/tests/forms_tests/tests/test_utils.py @@ -134,7 +134,8 @@ class FormsUtilsTestCase(SimpleTestCase): self.assertHTMLEqual( str(ErrorList([example])), '<ul class="errorlist"><li>Example of link: ' - "<a href="http://www.example.com/">example</a></li></ul>", + "<a href="http://www.example.com/">example</a>" + "</li></ul>", ) self.assertHTMLEqual( str(ErrorList([mark_safe(example)])), @@ -144,7 +145,8 @@ class FormsUtilsTestCase(SimpleTestCase): self.assertHTMLEqual( str(ErrorDict({"name": example})), '<ul class="errorlist"><li>nameExample of link: ' - "<a href="http://www.example.com/">example</a></li></ul>", + "<a href="http://www.example.com/">example</a>" + "</li></ul>", ) self.assertHTMLEqual( str(ErrorDict({"name": mark_safe(example)})), diff --git a/tests/forms_tests/tests/tests.py b/tests/forms_tests/tests/tests.py index 5a860037e5..aba405db15 100644 --- a/tests/forms_tests/tests/tests.py +++ b/tests/forms_tests/tests/tests.py @@ -66,7 +66,10 @@ class TestTicket14567(TestCase): """ def test_empty_queryset_return(self): - "If a model's ManyToManyField has blank=True and is saved with no data, a queryset is returned." + """ + If a model's ManyToManyField has blank=True and is saved with no data, + a queryset is returned. + """ option = ChoiceOptionModel.objects.create(name="default") form = OptionalMultiChoiceModelForm( {"multi_choice_optional": "", "multi_choice": [option.pk]} @@ -82,7 +85,10 @@ class TestTicket14567(TestCase): class ModelFormCallableModelDefault(TestCase): def test_no_empty_option(self): - "If a model's ForeignKey has blank=False and a default, no empty option is created (Refs #10792)." + """ + If a model's ForeignKey has blank=False and a default, no empty option + is created. + """ option = ChoiceOptionModel.objects.create(name="default") choices = list(ChoiceFieldForm().fields["choice"].choices) @@ -90,34 +96,52 @@ class ModelFormCallableModelDefault(TestCase): self.assertEqual(choices[0], (option.pk, str(option))) def test_callable_initial_value(self): - "The initial value for a callable default returning a queryset is the pk (refs #13769)" + """ + The initial value for a callable default returning a queryset is the + pk. + """ ChoiceOptionModel.objects.create(id=1, name="default") ChoiceOptionModel.objects.create(id=2, name="option 2") ChoiceOptionModel.objects.create(id=3, name="option 3") self.assertHTMLEqual( ChoiceFieldForm().as_p(), - """<p><label for="id_choice">Choice:</label> <select name="choice" id="id_choice"> -<option value="1" selected>ChoiceOption 1</option> -<option value="2">ChoiceOption 2</option> -<option value="3">ChoiceOption 3</option> -</select><input type="hidden" name="initial-choice" value="1" id="initial-id_choice"></p> -<p><label for="id_choice_int">Choice int:</label> <select name="choice_int" id="id_choice_int"> -<option value="1" selected>ChoiceOption 1</option> -<option value="2">ChoiceOption 2</option> -<option value="3">ChoiceOption 3</option> -</select><input type="hidden" name="initial-choice_int" value="1" id="initial-id_choice_int"></p> -<p><label for="id_multi_choice">Multi choice:</label> -<select multiple name="multi_choice" id="id_multi_choice" required> -<option value="1" selected>ChoiceOption 1</option> -<option value="2">ChoiceOption 2</option> -<option value="3">ChoiceOption 3</option> -</select><input type="hidden" name="initial-multi_choice" value="1" id="initial-id_multi_choice_0"></p> -<p><label for="id_multi_choice_int">Multi choice int:</label> -<select multiple name="multi_choice_int" id="id_multi_choice_int" required> -<option value="1" selected>ChoiceOption 1</option> -<option value="2">ChoiceOption 2</option> -<option value="3">ChoiceOption 3</option> -</select><input type="hidden" name="initial-multi_choice_int" value="1" id="initial-id_multi_choice_int_0"></p>""", + """ + <p><label for="id_choice">Choice:</label> + <select name="choice" id="id_choice"> + <option value="1" selected>ChoiceOption 1</option> + <option value="2">ChoiceOption 2</option> + <option value="3">ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-choice" value="1" id="initial-id_choice"> + </p> + <p><label for="id_choice_int">Choice int:</label> + <select name="choice_int" id="id_choice_int"> + <option value="1" selected>ChoiceOption 1</option> + <option value="2">ChoiceOption 2</option> + <option value="3">ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-choice_int" value="1" + id="initial-id_choice_int"> + </p> + <p><label for="id_multi_choice">Multi choice:</label> + <select multiple name="multi_choice" id="id_multi_choice" required> + <option value="1" selected>ChoiceOption 1</option> + <option value="2">ChoiceOption 2</option> + <option value="3">ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-multi_choice" value="1" + id="initial-id_multi_choice_0"> + </p> + <p><label for="id_multi_choice_int">Multi choice int:</label> + <select multiple name="multi_choice_int" id="id_multi_choice_int" required> + <option value="1" selected>ChoiceOption 1</option> + <option value="2">ChoiceOption 2</option> + <option value="3">ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-multi_choice_int" value="1" + id="initial-id_multi_choice_int_0"> + </p> + """, ) def test_initial_instance_value(self): @@ -136,30 +160,47 @@ class ModelFormCallableModelDefault(TestCase): ), } ).as_p(), - """<p><label for="id_choice">Choice:</label> <select name="choice" id="id_choice"> -<option value="1">ChoiceOption 1</option> -<option value="2" selected>ChoiceOption 2</option> -<option value="3">ChoiceOption 3</option> -</select><input type="hidden" name="initial-choice" value="2" id="initial-id_choice"></p> -<p><label for="id_choice_int">Choice int:</label> <select name="choice_int" id="id_choice_int"> -<option value="1">ChoiceOption 1</option> -<option value="2" selected>ChoiceOption 2</option> -<option value="3">ChoiceOption 3</option> -</select><input type="hidden" name="initial-choice_int" value="2" id="initial-id_choice_int"></p> -<p><label for="id_multi_choice">Multi choice:</label> -<select multiple name="multi_choice" id="id_multi_choice" required> -<option value="1">ChoiceOption 1</option> -<option value="2" selected>ChoiceOption 2</option> -<option value="3" selected>ChoiceOption 3</option> -</select><input type="hidden" name="initial-multi_choice" value="2" id="initial-id_multi_choice_0"> -<input type="hidden" name="initial-multi_choice" value="3" id="initial-id_multi_choice_1"></p> -<p><label for="id_multi_choice_int">Multi choice int:</label> -<select multiple name="multi_choice_int" id="id_multi_choice_int" required> -<option value="1">ChoiceOption 1</option> -<option value="2" selected>ChoiceOption 2</option> -<option value="3" selected>ChoiceOption 3</option> -</select><input type="hidden" name="initial-multi_choice_int" value="2" id="initial-id_multi_choice_int_0"> -<input type="hidden" name="initial-multi_choice_int" value="3" id="initial-id_multi_choice_int_1"></p>""", + """ + <p><label for="id_choice">Choice:</label> + <select name="choice" id="id_choice"> + <option value="1">ChoiceOption 1</option> + <option value="2" selected>ChoiceOption 2</option> + <option value="3">ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-choice" value="2" id="initial-id_choice"> + </p> + <p><label for="id_choice_int">Choice int:</label> + <select name="choice_int" id="id_choice_int"> + <option value="1">ChoiceOption 1</option> + <option value="2" selected>ChoiceOption 2</option> + <option value="3">ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-choice_int" value="2" + id="initial-id_choice_int"> + </p> + <p><label for="id_multi_choice">Multi choice:</label> + <select multiple name="multi_choice" id="id_multi_choice" required> + <option value="1">ChoiceOption 1</option> + <option value="2" selected>ChoiceOption 2</option> + <option value="3" selected>ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-multi_choice" value="2" + id="initial-id_multi_choice_0"> + <input type="hidden" name="initial-multi_choice" value="3" + id="initial-id_multi_choice_1"> + </p> + <p><label for="id_multi_choice_int">Multi choice int:</label> + <select multiple name="multi_choice_int" id="id_multi_choice_int" required> + <option value="1">ChoiceOption 1</option> + <option value="2" selected>ChoiceOption 2</option> + <option value="3" selected>ChoiceOption 3</option> + </select> + <input type="hidden" name="initial-multi_choice_int" value="2" + id="initial-id_multi_choice_int_0"> + <input type="hidden" name="initial-multi_choice_int" value="3" + id="initial-id_multi_choice_int_1"> + </p> + """, ) @@ -194,9 +235,8 @@ class FormsModelTestCase(TestCase): self.assertFalse(f.is_valid()) def test_formfield_initial(self): - # Formfield initial values ######## - # If the model has default values for some fields, they are used as the formfield - # initial values. + # If the model has default values for some fields, they are used as the + # formfield initial values. class DefaultsForm(ModelForm): class Meta: model = Defaults @@ -323,25 +363,32 @@ class EmptyLabelTestCase(TestCase): f = EmptyCharLabelChoiceForm() self.assertHTMLEqual( f.as_p(), - """<p><label for="id_name">Name:</label> <input id="id_name" maxlength="10" name="name" type="text" required></p> -<p><label for="id_choice">Choice:</label> <select id="id_choice" name="choice"> -<option value="" selected>No Preference</option> -<option value="f">Foo</option> -<option value="b">Bar</option> -</select></p>""", + """ + <p><label for="id_name">Name:</label> + <input id="id_name" maxlength="10" name="name" type="text" required></p> + <p><label for="id_choice">Choice:</label> + <select id="id_choice" name="choice"> + <option value="" selected>No Preference</option> + <option value="f">Foo</option> + <option value="b">Bar</option> + </select></p> + """, ) def test_empty_field_char_none(self): f = EmptyCharLabelNoneChoiceForm() self.assertHTMLEqual( f.as_p(), - """<p><label for="id_name">Name:</label> <input id="id_name" maxlength="10" name="name" type="text" required></p> -<p><label for="id_choice_string_w_none">Choice string w none:</label> -<select id="id_choice_string_w_none" name="choice_string_w_none"> -<option value="" selected>No Preference</option> -<option value="f">Foo</option> -<option value="b">Bar</option> -</select></p>""", + """ + <p><label for="id_name">Name:</label> + <input id="id_name" maxlength="10" name="name" type="text" required></p> + <p><label for="id_choice_string_w_none">Choice string w none:</label> + <select id="id_choice_string_w_none" name="choice_string_w_none"> + <option value="" selected>No Preference</option> + <option value="f">Foo</option> + <option value="b">Bar</option> + </select></p> + """, ) def test_save_empty_label_forms(self): @@ -367,13 +414,16 @@ class EmptyLabelTestCase(TestCase): f = EmptyIntegerLabelChoiceForm() self.assertHTMLEqual( f.as_p(), - """<p><label for="id_name">Name:</label> <input id="id_name" maxlength="10" name="name" type="text" required></p> -<p><label for="id_choice_integer">Choice integer:</label> -<select id="id_choice_integer" name="choice_integer"> -<option value="" selected>No Preference</option> -<option value="1">Foo</option> -<option value="2">Bar</option> -</select></p>""", + """ + <p><label for="id_name">Name:</label> + <input id="id_name" maxlength="10" name="name" type="text" required></p> + <p><label for="id_choice_integer">Choice integer:</label> + <select id="id_choice_integer" name="choice_integer"> + <option value="" selected>No Preference</option> + <option value="1">Foo</option> + <option value="2">Bar</option> + </select></p> + """, ) def test_get_display_value_on_none(self): @@ -386,28 +436,36 @@ class EmptyLabelTestCase(TestCase): f = EmptyIntegerLabelChoiceForm(instance=none_model) self.assertHTMLEqual( f.as_p(), - """<p><label for="id_name">Name:</label> -<input id="id_name" maxlength="10" name="name" type="text" value="none-test" required></p> -<p><label for="id_choice_integer">Choice integer:</label> -<select id="id_choice_integer" name="choice_integer"> -<option value="" selected>No Preference</option> -<option value="1">Foo</option> -<option value="2">Bar</option> -</select></p>""", + """ + <p><label for="id_name">Name:</label> + <input id="id_name" maxlength="10" name="name" type="text" + value="none-test" required> + </p> + <p><label for="id_choice_integer">Choice integer:</label> + <select id="id_choice_integer" name="choice_integer"> + <option value="" selected>No Preference</option> + <option value="1">Foo</option> + <option value="2">Bar</option> + </select></p> + """, ) foo_model = ChoiceModel(name="foo-test", choice_integer=1) f = EmptyIntegerLabelChoiceForm(instance=foo_model) self.assertHTMLEqual( f.as_p(), - """<p><label for="id_name">Name:</label> -<input id="id_name" maxlength="10" name="name" type="text" value="foo-test" required></p> -<p><label for="id_choice_integer">Choice integer:</label> -<select id="id_choice_integer" name="choice_integer"> -<option value="">No Preference</option> -<option value="1" selected>Foo</option> -<option value="2">Bar</option> -</select></p>""", + """ + <p><label for="id_name">Name:</label> + <input id="id_name" maxlength="10" name="name" type="text" + value="foo-test" required> + </p> + <p><label for="id_choice_integer">Choice integer:</label> + <select id="id_choice_integer" name="choice_integer"> + <option value="">No Preference</option> + <option value="1" selected>Foo</option> + <option value="2">Bar</option> + </select></p> + """, ) diff --git a/tests/forms_tests/widget_tests/test_checkboxinput.py b/tests/forms_tests/widget_tests/test_checkboxinput.py index 0f65e876df..c30aadbbb1 100644 --- a/tests/forms_tests/widget_tests/test_checkboxinput.py +++ b/tests/forms_tests/widget_tests/test_checkboxinput.py @@ -86,7 +86,8 @@ class CheckboxInputTest(WidgetTest): "greeting", "hello & goodbye", html=( - '<input checked type="checkbox" name="greeting" value="hello & goodbye">' + '<input checked type="checkbox" name="greeting" ' + 'value="hello & goodbye">' ), ) diff --git a/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py b/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py index 35db8192ef..89cd473638 100644 --- a/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py +++ b/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py @@ -17,10 +17,14 @@ class CheckboxSelectMultipleTest(WidgetTest): ["J"], html=""" <div> - <div><label><input checked type="checkbox" name="beatles" value="J"> John</label></div> - <div><label><input type="checkbox" name="beatles" value="P"> Paul</label></div> - <div><label><input type="checkbox" name="beatles" value="G"> George</label></div> - <div><label><input type="checkbox" name="beatles" value="R"> Ringo</label></div> + <div><label><input checked type="checkbox" name="beatles" value="J"> John + </label></div> + <div><label><input type="checkbox" name="beatles" value="P"> Paul + </label></div> + <div><label><input type="checkbox" name="beatles" value="G"> George + </label></div> + <div><label><input type="checkbox" name="beatles" value="R"> Ringo + </label></div> </div> """, ) @@ -32,10 +36,14 @@ class CheckboxSelectMultipleTest(WidgetTest): ["J", "P"], html=""" <div> - <div><label><input checked type="checkbox" name="beatles" value="J"> John</label></div> - <div><label><input checked type="checkbox" name="beatles" value="P"> Paul</label></div> - <div><label><input type="checkbox" name="beatles" value="G"> George</label></div> - <div><label><input type="checkbox" name="beatles" value="R"> Ringo</label></div> + <div><label><input checked type="checkbox" name="beatles" value="J"> John + </label></div> + <div><label><input checked type="checkbox" name="beatles" value="P"> Paul + </label></div> + <div><label><input type="checkbox" name="beatles" value="G"> George + </label></div> + <div><label><input type="checkbox" name="beatles" value="R"> Ringo + </label></div> </div> """, ) @@ -51,11 +59,16 @@ class CheckboxSelectMultipleTest(WidgetTest): None, html=""" <div> - <div><label><input type="checkbox" name="beatles" value=""> Unknown</label></div> - <div><label><input type="checkbox" name="beatles" value="J"> John</label></div> - <div><label><input type="checkbox" name="beatles" value="P"> Paul</label></div> - <div><label><input type="checkbox" name="beatles" value="G"> George</label></div> - <div><label><input type="checkbox" name="beatles" value="R"> Ringo</label></div> + <div><label><input type="checkbox" name="beatles" value=""> Unknown + </label></div> + <div><label><input type="checkbox" name="beatles" value="J"> John + </label></div> + <div><label><input type="checkbox" name="beatles" value="P"> Paul + </label></div> + <div><label><input type="checkbox" name="beatles" value="G"> George + </label></div> + <div><label><input type="checkbox" name="beatles" value="R"> Ringo + </label></div> </div> """, ) @@ -69,19 +82,24 @@ class CheckboxSelectMultipleTest(WidgetTest): html = """ <div id="media"> <div> <label for="media_0"> - <input type="checkbox" name="nestchoice" value="unknown" id="media_0"> Unknown</label></div> + <input type="checkbox" name="nestchoice" value="unknown" id="media_0"> Unknown + </label></div> <div> <label>Audio</label> <div> <label for="media_1_0"> - <input checked type="checkbox" name="nestchoice" value="vinyl" id="media_1_0"> Vinyl</label></div> + <input checked type="checkbox" name="nestchoice" value="vinyl" id="media_1_0"> + Vinyl</label></div> <div> <label for="media_1_1"> - <input type="checkbox" name="nestchoice" value="cd" id="media_1_1"> CD</label></div> + <input type="checkbox" name="nestchoice" value="cd" id="media_1_1"> CD + </label></div> </div><div> <label>Video</label> <div> <label for="media_2_0"> - <input type="checkbox" name="nestchoice" value="vhs" id="media_2_0"> VHS</label></div> + <input type="checkbox" name="nestchoice" value="vhs" id="media_2_0"> VHS + </label></div> <div> <label for="media_2_1"> - <input type="checkbox" name="nestchoice" value="dvd" id="media_2_1" checked> DVD</label></div> + <input type="checkbox" name="nestchoice" value="dvd" id="media_2_1" checked> DVD + </label></div> </div> </div> """ @@ -101,15 +119,21 @@ class CheckboxSelectMultipleTest(WidgetTest): ) html = """ <div> - <div> <label><input type="checkbox" name="nestchoice" value="unknown"> Unknown</label></div> + <div> <label> + <input type="checkbox" name="nestchoice" value="unknown"> Unknown</label></div> <div> <label>Audio</label> - <div> <label><input checked type="checkbox" name="nestchoice" value="vinyl"> Vinyl</label></div> - <div> <label><input type="checkbox" name="nestchoice" value="cd"> CD</label></div> + <div> <label> + <input checked type="checkbox" name="nestchoice" value="vinyl"> Vinyl + </label></div> + <div> <label> + <input type="checkbox" name="nestchoice" value="cd"> CD</label></div> </div><div> <label>Video</label> - <div> <label><input type="checkbox" name="nestchoice" value="vhs"> VHS</label></div> - <div> <label><input type="checkbox" name="nestchoice" value="dvd"checked> DVD</label></div> + <div> <label> + <input type="checkbox" name="nestchoice" value="vhs"> VHS</label></div> + <div> <label> + <input type="checkbox" name="nestchoice" value="dvd"checked> DVD</label></div> </div> </div> """ @@ -128,11 +152,14 @@ class CheckboxSelectMultipleTest(WidgetTest): html = """ <div id="abc"> <div> - <label for="abc_0"><input checked type="checkbox" name="letters" value="a" id="abc_0"> A</label> + <label for="abc_0"> + <input checked type="checkbox" name="letters" value="a" id="abc_0"> A</label> </div> - <div><label for="abc_1"><input type="checkbox" name="letters" value="b" id="abc_1"> B</label></div> + <div><label for="abc_1"> + <input type="checkbox" name="letters" value="b" id="abc_1"> B</label></div> <div> - <label for="abc_2"><input checked type="checkbox" name="letters" value="c" id="abc_2"> C</label> + <label for="abc_2"> + <input checked type="checkbox" name="letters" value="c" id="abc_2"> C</label> </div> </div> """ @@ -154,11 +181,14 @@ class CheckboxSelectMultipleTest(WidgetTest): html = """ <div id="abc"> <div> - <label for="abc_0"><input checked type="checkbox" name="letters" value="a" id="abc_0"> A</label> + <label for="abc_0"> + <input checked type="checkbox" name="letters" value="a" id="abc_0"> A</label> </div> - <div><label for="abc_1"><input type="checkbox" name="letters" value="b" id="abc_1"> B</label></div> + <div><label for="abc_1"> + <input type="checkbox" name="letters" value="b" id="abc_1"> B</label></div> <div> - <label for="abc_2"><input checked type="checkbox" name="letters" value="c" id="abc_2"> C</label> + <label for="abc_2"> + <input checked type="checkbox" name="letters" value="c" id="abc_2"> C</label> </div> </div> """ @@ -174,8 +204,10 @@ class CheckboxSelectMultipleTest(WidgetTest): html = """ <div> <div><label><input type="checkbox" name="numbers" value="1"> One</label></div> - <div><label><input type="checkbox" name="numbers" value="1000"> One thousand</label></div> - <div><label><input type="checkbox" name="numbers" value="1000000"> One million</label></div> + <div><label> + <input type="checkbox" name="numbers" value="1000"> One thousand</label></div> + <div><label> + <input type="checkbox" name="numbers" value="1000000"> One million</label></div> </div> """ self.check_html(self.widget(choices=choices), "numbers", None, html=html) @@ -186,8 +218,10 @@ class CheckboxSelectMultipleTest(WidgetTest): ] html = """ <div> - <div><label><input type="checkbox" name="times" value="00:00:00"> midnight</label></div> - <div><label><input type="checkbox" name="times" value="12:00:00"> noon</label></div> + <div><label> + <input type="checkbox" name="times" value="00:00:00"> midnight</label></div> + <div><label> + <input type="checkbox" name="times" value="12:00:00"> noon</label></div> </div> """ self.check_html(self.widget(choices=choices), "times", None, html=html) diff --git a/tests/forms_tests/widget_tests/test_clearablefileinput.py b/tests/forms_tests/widget_tests/test_clearablefileinput.py index 03fe34306b..630ff79486 100644 --- a/tests/forms_tests/widget_tests/test_clearablefileinput.py +++ b/tests/forms_tests/widget_tests/test_clearablefileinput.py @@ -56,12 +56,14 @@ class ClearableFileInputTest(WidgetTest): StrangeFieldFile(), html=( """ - Currently: <a href="something?chapter=1&sect=2&copy=3&lang=en"> - something<div onclick="alert('oops')">.jpg</a> - <input type="checkbox" name="my<div>file-clear" id="my<div>file-clear_id"> - <label for="my<div>file-clear_id">Clear</label><br> - Change: <input type="file" name="my<div>file"> - """ + Currently: + <a href="something?chapter=1&sect=2&copy=3&lang=en"> + something<div onclick="alert('oops')">.jpg</a> + <input type="checkbox" name="my<div>file-clear" + id="my<div>file-clear_id"> + <label for="my<div>file-clear_id">Clear</label><br> + Change: <input type="file" name="my<div>file"> + """ ), ) diff --git a/tests/forms_tests/widget_tests/test_datetimeinput.py b/tests/forms_tests/widget_tests/test_datetimeinput.py index 5795660f30..e9bb77eb69 100644 --- a/tests/forms_tests/widget_tests/test_datetimeinput.py +++ b/tests/forms_tests/widget_tests/test_datetimeinput.py @@ -85,7 +85,10 @@ class DateTimeInputTest(WidgetTest): self.widget, "date", d, - html='<input type="text" name="date" value="2007-09-17 12:51:34">', + html=( + '<input type="text" name="date" ' + 'value="2007-09-17 12:51:34">' + ), ) with translation.override("es"): self.check_html( diff --git a/tests/forms_tests/widget_tests/test_multiplehiddeninput.py b/tests/forms_tests/widget_tests/test_multiplehiddeninput.py index d0ad188929..9498b756e9 100644 --- a/tests/forms_tests/widget_tests/test_multiplehiddeninput.py +++ b/tests/forms_tests/widget_tests/test_multiplehiddeninput.py @@ -31,7 +31,10 @@ class MultipleHiddenInputTest(WidgetTest): "email", ["test@example.com"], attrs={"class": "fun"}, - html='<input type="hidden" name="email" value="test@example.com" class="fun">', + html=( + '<input type="hidden" name="email" value="test@example.com" ' + 'class="fun">' + ), ) def test_render_attrs_multiple(self): @@ -41,7 +44,8 @@ class MultipleHiddenInputTest(WidgetTest): ["test@example.com", "foo@example.com"], attrs={"class": "fun"}, html=( - '<input type="hidden" name="email" value="test@example.com" class="fun">\n' + '<input type="hidden" name="email" value="test@example.com" ' + 'class="fun">\n' '<input type="hidden" name="email" value="foo@example.com" class="fun">' ), ) @@ -53,15 +57,19 @@ class MultipleHiddenInputTest(WidgetTest): widget, "email", ["foo@example.com"], - html='<input type="hidden" class="fun" value="foo@example.com" name="email">', + html=( + '<input type="hidden" class="fun" value="foo@example.com" name="email">' + ), ) self.check_html( widget, "email", ["foo@example.com", "test@example.com"], html=( - '<input type="hidden" class="fun" value="foo@example.com" name="email">\n' - '<input type="hidden" class="fun" value="test@example.com" name="email">' + '<input type="hidden" class="fun" value="foo@example.com" ' + 'name="email">\n' + '<input type="hidden" class="fun" value="test@example.com" ' + 'name="email">' ), ) self.check_html( @@ -69,7 +77,10 @@ class MultipleHiddenInputTest(WidgetTest): "email", ["foo@example.com"], attrs={"class": "special"}, - html='<input type="hidden" class="special" value="foo@example.com" name="email">', + html=( + '<input type="hidden" class="special" value="foo@example.com" ' + 'name="email">' + ), ) def test_render_empty(self): diff --git a/tests/forms_tests/widget_tests/test_multiwidget.py b/tests/forms_tests/widget_tests/test_multiwidget.py index c3f676e3f7..a89082c4a6 100644 --- a/tests/forms_tests/widget_tests/test_multiwidget.py +++ b/tests/forms_tests/widget_tests/test_multiwidget.py @@ -143,7 +143,8 @@ class MultiWidgetTest(WidgetTest): attrs={"id": "foo"}, html=( '<input id="foo_0" type="text" class="big" value="john" name="name_0">' - '<input id="foo_1" type="text" class="small" value="lennon" name="name_1">' + '<input id="foo_1" type="text" class="small" value="lennon" ' + 'name="name_1">' ), ) @@ -161,7 +162,8 @@ class MultiWidgetTest(WidgetTest): ["john", "lennon"], html=( '<input id="bar_0" type="text" class="big" value="john" name="name_0">' - '<input id="bar_1" type="text" class="small" value="lennon" name="name_1">' + '<input id="bar_1" type="text" class="small" value="lennon" ' + 'name="name_1">' ), ) diff --git a/tests/forms_tests/widget_tests/test_numberinput.py b/tests/forms_tests/widget_tests/test_numberinput.py index a6427e6e37..15df02db4f 100644 --- a/tests/forms_tests/widget_tests/test_numberinput.py +++ b/tests/forms_tests/widget_tests/test_numberinput.py @@ -12,5 +12,6 @@ class NumberInputTests(WidgetTest): widget, "name", "value", - '<input type="number" name="name" value="value" max="12345" min="1234" step="9999">', + '<input type="number" name="name" value="value" max="12345" min="1234" ' + 'step="9999">', ) diff --git a/tests/forms_tests/widget_tests/test_radioselect.py b/tests/forms_tests/widget_tests/test_radioselect.py index 89e4022f1c..5aa4c194de 100644 --- a/tests/forms_tests/widget_tests/test_radioselect.py +++ b/tests/forms_tests/widget_tests/test_radioselect.py @@ -18,9 +18,11 @@ class RadioSelectTest(WidgetTest): html=""" <div> <div><label><input type="radio" name="beatle" value=""> ------</label></div> - <div><label><input checked type="radio" name="beatle" value="J"> John</label></div> + <div><label> + <input checked type="radio" name="beatle" value="J"> John</label></div> <div><label><input type="radio" name="beatle" value="P"> Paul</label></div> - <div><label><input type="radio" name="beatle" value="G"> George</label></div> + <div><label> + <input type="radio" name="beatle" value="G"> George</label></div> <div><label><input type="radio" name="beatle" value="R"> Ringo</label></div> </div> """, @@ -35,19 +37,28 @@ class RadioSelectTest(WidgetTest): html = """ <div id="media"> <div> - <label for="media_0"><input type="radio" name="nestchoice" value="unknown" id="media_0"> Unknown</label></div> + <label for="media_0"> + <input type="radio" name="nestchoice" value="unknown" id="media_0"> Unknown + </label></div> <div> <label>Audio</label> <div> - <label for="media_1_0"><input type="radio" name="nestchoice" value="vinyl" id="media_1_0"> Vinyl</label></div> - <div> <label for="media_1_1"><input type="radio" name="nestchoice" value="cd" id="media_1_1"> CD</label></div> + <label for="media_1_0"> + <input type="radio" name="nestchoice" value="vinyl" id="media_1_0"> Vinyl + </label></div> + <div> <label for="media_1_1"> + <input type="radio" name="nestchoice" value="cd" id="media_1_1"> CD + </label></div> </div><div> <label>Video</label> <div> - <label for="media_2_0"><input type="radio" name="nestchoice" value="vhs" id="media_2_0"> VHS</label></div> + <label for="media_2_0"> + <input type="radio" name="nestchoice" value="vhs" id="media_2_0"> VHS + </label></div> <div> - <label for="media_2_1"><input type="radio" name="nestchoice" value="dvd" id="media_2_1" checked> DVD</label> - </div> + <label for="media_2_1"> + <input type="radio" name="nestchoice" value="dvd" id="media_2_1" checked> DVD + </label></div> </div> </div> """ @@ -68,11 +79,15 @@ class RadioSelectTest(WidgetTest): html = """ <div id="foo"> <div> - <label for="foo_0"><input checked type="radio" id="foo_0" value="J" name="beatle"> John</label> + <label for="foo_0"> + <input checked type="radio" id="foo_0" value="J" name="beatle"> John</label> </div> - <div><label for="foo_1"><input type="radio" id="foo_1" value="P" name="beatle"> Paul</label></div> - <div><label for="foo_2"><input type="radio" id="foo_2" value="G" name="beatle"> George</label></div> - <div><label for="foo_3"><input type="radio" id="foo_3" value="R" name="beatle"> Ringo</label></div> + <div><label for="foo_1"> + <input type="radio" id="foo_1" value="P" name="beatle"> Paul</label></div> + <div><label for="foo_2"> + <input type="radio" id="foo_2" value="G" name="beatle"> George</label></div> + <div><label for="foo_3"> + <input type="radio" id="foo_3" value="R" name="beatle"> Ringo</label></div> </div> """ self.check_html(widget, "beatle", "J", html=html) @@ -85,11 +100,15 @@ class RadioSelectTest(WidgetTest): html = """ <div id="bar"> <div> - <label for="bar_0"><input checked type="radio" id="bar_0" value="J" name="beatle"> John</label> + <label for="bar_0"> + <input checked type="radio" id="bar_0" value="J" name="beatle"> John</label> </div> - <div><label for="bar_1"><input type="radio" id="bar_1" value="P" name="beatle"> Paul</label></div> - <div><label for="bar_2"><input type="radio" id="bar_2" value="G" name="beatle"> George</label></div> - <div><label for="bar_3"><input type="radio" id="bar_3" value="R" name="beatle"> Ringo</label></div> + <div><label for="bar_1"> + <input type="radio" id="bar_1" value="P" name="beatle"> Paul</label></div> + <div><label for="bar_2"> + <input type="radio" id="bar_2" value="G" name="beatle"> George</label></div> + <div><label for="bar_3"> + <input type="radio" id="bar_3" value="R" name="beatle"> Ringo</label></div> </div> """ self.check_html( @@ -107,10 +126,15 @@ class RadioSelectTest(WidgetTest): """ html = """ <div class="bar"> - <div><label><input checked type="radio" class="bar" value="J" name="beatle"> John</label></div> - <div><label><input type="radio" class="bar" value="P" name="beatle"> Paul</label></div> - <div><label><input type="radio" class="bar" value="G" name="beatle"> George</label></div> - <div><label><input type="radio" class="bar" value="R" name="beatle"> Ringo</label></div> + <div><label> + <input checked type="radio" class="bar" value="J" name="beatle"> John</label> + </div> + <div><label> + <input type="radio" class="bar" value="P" name="beatle"> Paul</label></div> + <div><label> + <input type="radio" class="bar" value="G" name="beatle"> George</label></div> + <div><label> + <input type="radio" class="bar" value="R" name="beatle"> Ringo</label></div> </div> """ self.check_html( @@ -131,8 +155,10 @@ class RadioSelectTest(WidgetTest): html = """ <div> <div><label><input type="radio" name="number" value="1"> One</label></div> - <div><label><input type="radio" name="number" value="1000"> One thousand</label></div> - <div><label><input type="radio" name="number" value="1000000"> One million</label></div> + <div><label> + <input type="radio" name="number" value="1000"> One thousand</label></div> + <div><label> + <input type="radio" name="number" value="1000000"> One million</label></div> </div> """ self.check_html(self.widget(choices=choices), "number", None, html=html) @@ -143,8 +169,10 @@ class RadioSelectTest(WidgetTest): ] html = """ <div> - <div><label><input type="radio" name="time" value="00:00:00"> midnight</label></div> - <div><label><input type="radio" name="time" value="12:00:00"> noon</label></div> + <div><label> + <input type="radio" name="time" value="00:00:00"> midnight</label></div> + <div><label> + <input type="radio" name="time" value="12:00:00"> noon</label></div> </div> """ self.check_html(self.widget(choices=choices), "time", None, html=html) @@ -158,11 +186,16 @@ class RadioSelectTest(WidgetTest): ["J"], html=""" <div> - <div><label><input type="radio" name="beatle_0" value=""> ------</label></div> - <div><label><input checked type="radio" name="beatle_0" value="J"> John</label></div> - <div><label><input type="radio" name="beatle_0" value="P"> Paul</label></div> - <div><label><input type="radio" name="beatle_0" value="G"> George</label></div> - <div><label><input type="radio" name="beatle_0" value="R"> Ringo</label></div> + <div><label> + <input type="radio" name="beatle_0" value=""> ------</label></div> + <div><label> + <input checked type="radio" name="beatle_0" value="J"> John</label></div> + <div><label> + <input type="radio" name="beatle_0" value="P"> Paul</label></div> + <div><label> + <input type="radio" name="beatle_0" value="G"> George</label></div> + <div><label> + <input type="radio" name="beatle_0" value="R"> Ringo</label></div> </div> """, ) diff --git a/tests/forms_tests/widget_tests/test_select.py b/tests/forms_tests/widget_tests/test_select.py index e78feeb110..8a40bd8b6a 100644 --- a/tests/forms_tests/widget_tests/test_select.py +++ b/tests/forms_tests/widget_tests/test_select.py @@ -227,12 +227,16 @@ class SelectTest(WidgetTest): "email", "ŠĐĆŽćžšđ", html=( - """<select name="email"> - <option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" selected> + """ + <select name="email"> + <option value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" + selected> \u0160\u0110abc\u0106\u017d\u0107\u017e\u0161\u0111 </option> - <option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111</option> - </select>""" + <option value="\u0107\u017e\u0161\u0111">abc\u0107\u017e\u0161\u0111 + </option> + </select> + """ ), ) diff --git a/tests/forms_tests/widget_tests/test_selectdatewidget.py b/tests/forms_tests/widget_tests/test_selectdatewidget.py index de0c35cd5b..9192e4c1f1 100644 --- a/tests/forms_tests/widget_tests/test_selectdatewidget.py +++ b/tests/forms_tests/widget_tests/test_selectdatewidget.py @@ -520,7 +520,8 @@ class SelectDateWidgetTest(WidgetTest): """, ) - # Even with an invalid date, the widget should reflect the entered value (#17401). + # Even with an invalid date, the widget should reflect the entered + # value. self.assertEqual(w.render("mydate", "2010-02-30").count("selected"), 3) # Years before 1900 should work. diff --git a/tests/forms_tests/widget_tests/test_textarea.py b/tests/forms_tests/widget_tests/test_textarea.py index e92dfc51f4..e7695ab018 100644 --- a/tests/forms_tests/widget_tests/test_textarea.py +++ b/tests/forms_tests/widget_tests/test_textarea.py @@ -47,7 +47,8 @@ class TextareaTest(WidgetTest): "msg", 'some "quoted" & ampersanded value', html=( - '<textarea rows="10" cols="40" name="msg">some "quoted" & ampersanded value</textarea>' + '<textarea rows="10" cols="40" name="msg">' + "some "quoted" & ampersanded value</textarea>" ), ) @@ -57,6 +58,7 @@ class TextareaTest(WidgetTest): "msg", mark_safe("pre "quoted" value"), html=( - '<textarea rows="10" cols="40" name="msg">pre "quoted" value</textarea>' + '<textarea rows="10" cols="40" name="msg">pre "quoted" value' + "</textarea>" ), ) diff --git a/tests/forms_tests/widget_tests/test_textinput.py b/tests/forms_tests/widget_tests/test_textinput.py index 52ffabec65..efd0cfed4b 100644 --- a/tests/forms_tests/widget_tests/test_textinput.py +++ b/tests/forms_tests/widget_tests/test_textinput.py @@ -48,7 +48,10 @@ class TextInputTest(WidgetTest): self.widget, "email", 'some "quoted" & ampersanded value', - html='<input type="text" name="email" value="some "quoted" & ampersanded value">', + html=( + '<input type="text" name="email" ' + 'value="some "quoted" & ampersanded value">' + ), ) def test_render_custom_attrs(self): @@ -57,7 +60,9 @@ class TextInputTest(WidgetTest): "email", "test@example.com", attrs={"class": "fun"}, - html='<input type="text" name="email" value="test@example.com" class="fun">', + html=( + '<input type="text" name="email" value="test@example.com" class="fun">' + ), ) def test_render_unicode(self): @@ -81,7 +86,9 @@ class TextInputTest(WidgetTest): widget, "email", "foo@example.com", - html='<input type="email" class="fun" value="foo@example.com" name="email">', + html=( + '<input type="email" class="fun" value="foo@example.com" name="email">' + ), ) def test_attrs_precedence(self): |