diff options
| author | Jon Dufresne <jon.dufresne@gmail.com> | 2018-01-20 08:19:06 -0800 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-01-20 11:19:06 -0500 |
| commit | 47d238b69602711c06c369a5555bb554a4b3f7fb (patch) | |
| tree | f1972664cbf2065277a5562f8637054f65f4e11e | |
| parent | b98dc1706e9c63a4cc7d061a3d8a95f6cbf5e950 (diff) | |
Fixed #29041 -- Changed SelectMultiple's multiple attribute to HTML5 boolean syntax.
| -rw-r--r-- | django/forms/widgets.py | 2 | ||||
| -rw-r--r-- | docs/ref/forms/widgets.txt | 2 | ||||
| -rw-r--r-- | docs/releases/2.1.txt | 4 | ||||
| -rw-r--r-- | tests/admin_widgets/tests.py | 4 | ||||
| -rw-r--r-- | tests/forms_tests/field_tests/test_multivaluefield.py | 4 | ||||
| -rw-r--r-- | tests/forms_tests/tests/test_forms.py | 18 | ||||
| -rw-r--r-- | tests/forms_tests/tests/tests.py | 8 | ||||
| -rw-r--r-- | tests/forms_tests/widget_tests/test_multiwidget.py | 2 | ||||
| -rw-r--r-- | tests/forms_tests/widget_tests/test_selectmultiple.py | 20 | ||||
| -rw-r--r-- | tests/model_forms/tests.py | 16 |
10 files changed, 42 insertions, 38 deletions
diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 8ccf939acd..6ccbb86274 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -670,7 +670,7 @@ class Select(ChoiceWidget): def get_context(self, name, value, attrs): context = super().get_context(name, value, attrs) if self.allow_multiple_selected: - context['widget']['attrs']['multiple'] = 'multiple' + context['widget']['attrs']['multiple'] = True return context @staticmethod diff --git a/docs/ref/forms/widgets.txt b/docs/ref/forms/widgets.txt index 12677eb908..dc6256ee06 100644 --- a/docs/ref/forms/widgets.txt +++ b/docs/ref/forms/widgets.txt @@ -664,7 +664,7 @@ that specifies the template used to render each choice. For example, for the * ``option_template_name``: ``'django/forms/widgets/select_option.html'`` Similar to :class:`Select`, but allows multiple selection: - ``<select multiple="multiple">...</select>`` + ``<select multiple>...</select>`` ``RadioSelect`` ~~~~~~~~~~~~~~~ diff --git a/docs/releases/2.1.txt b/docs/releases/2.1.txt index b979ba2224..2c1f199577 100644 --- a/docs/releases/2.1.txt +++ b/docs/releases/2.1.txt @@ -251,6 +251,10 @@ Miscellaneous * ``allowed_hosts`` is now a required argument of private API ``django.utils.http.is_safe_url()``. +* The ``multiple`` attribute rendered by the + :class:`~django.forms.SelectMultiple` widget now uses HTML5 boolean syntax + rather than XHTML's ``mulitple="multiple"``. + .. _deprecated-features-2.1: Features deprecated in 2.1 diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py index 0ce1c8e5d9..8c3f06670c 100644 --- a/tests/admin_widgets/tests.py +++ b/tests/admin_widgets/tests.py @@ -255,7 +255,7 @@ class FilteredSelectMultipleWidgetTest(SimpleTestCase): w = widgets.FilteredSelectMultiple('test\\', False) self.assertHTMLEqual( w.render('test', 'test'), - '<select multiple="multiple" name="test" class="selectfilter" ' + '<select multiple name="test" class="selectfilter" ' 'data-field-name="test\\" data-is-stacked="0">\n</select>' ) @@ -264,7 +264,7 @@ class FilteredSelectMultipleWidgetTest(SimpleTestCase): w = widgets.FilteredSelectMultiple('test\\', True) self.assertHTMLEqual( w.render('test', 'test'), - '<select multiple="multiple" name="test" class="selectfilterstacked" ' + '<select multiple name="test" class="selectfilterstacked" ' 'data-field-name="test\\" data-is-stacked="1">\n</select>' ) diff --git a/tests/forms_tests/field_tests/test_multivaluefield.py b/tests/forms_tests/field_tests/test_multivaluefield.py index cd446d07ce..edb32957e3 100644 --- a/tests/forms_tests/field_tests/test_multivaluefield.py +++ b/tests/forms_tests/field_tests/test_multivaluefield.py @@ -129,7 +129,7 @@ class MultiValueFieldTest(SimpleTestCase): """ <tr><th><label for="id_field1_0">Field1:</label></th> <td><input type="text" name="field1_0" id="id_field1_0" required /> - <select multiple="multiple" name="field1_1" id="id_field1_1" required> + <select multiple name="field1_1" id="id_field1_1" required> <option value="J">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -152,7 +152,7 @@ class MultiValueFieldTest(SimpleTestCase): """ <tr><th><label for="id_field1_0">Field1:</label></th> <td><input type="text" name="field1_0" value="some text" id="id_field1_0" required /> - <select multiple="multiple" name="field1_1" id="id_field1_1" 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> diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py index a6b157f044..4ec21f869e 100644 --- a/tests/forms_tests/tests/test_forms.py +++ b/tests/forms_tests/tests/test_forms.py @@ -760,7 +760,7 @@ Java</label></li> composers = MultipleChoiceField() f = SongForm(auto_id=False) - self.assertHTMLEqual(str(f['composers']), """<select multiple="multiple" name="composers" required> + self.assertHTMLEqual(str(f['composers']), """<select multiple name="composers" required> </select>""") class SongForm(Form): @@ -768,13 +768,13 @@ Java</label></li> composers = MultipleChoiceField(choices=[('J', 'John Lennon'), ('P', 'Paul McCartney')]) f = SongForm(auto_id=False) - self.assertHTMLEqual(str(f['composers']), """<select multiple="multiple" name="composers" required> + self.assertHTMLEqual(str(f['composers']), """<select multiple name="composers" required> <option value="J">John Lennon</option> <option value="P">Paul McCartney</option> </select>""") f = SongForm({'name': 'Yesterday', 'composers': ['P']}, auto_id=False) self.assertHTMLEqual(str(f['name']), '<input type="text" name="name" value="Yesterday" required />') - self.assertHTMLEqual(str(f['composers']), """<select multiple="multiple" name="composers" required> + self.assertHTMLEqual(str(f['composers']), """<select multiple name="composers" required> <option value="J">John Lennon</option> <option value="P" selected>Paul McCartney</option> </select>""") @@ -1865,7 +1865,7 @@ Password: <input type="password" name="password" required /></li>""" 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="multiple" name="options" required> +<li>Options: <select multiple name="options" required> <option value="f" selected>foo</option> <option value="b" selected>bar</option> <option value="w">whiz</option> @@ -1881,7 +1881,7 @@ Username: <input type="text" name="username" maxlength="10" required /></li> <li><ul class="errorlist"><li>This field is required.</li></ul> Password: <input type="password" name="password" required /></li> <li><ul class="errorlist"><li>This field is required.</li></ul> -Options: <select multiple="multiple" name="options" required> +Options: <select multiple name="options" required> <option value="f">foo</option> <option value="b">bar</option> <option value="w">whiz</option> @@ -1895,7 +1895,7 @@ Options: <select multiple="multiple" name="options" required> <li><ul class="errorlist"><li>This field is required.</li></ul> Password: <input type="password" name="password" required /></li> <li><ul class="errorlist"><li>This field is required.</li></ul> -Options: <select multiple="multiple" name="options" required> +Options: <select multiple name="options" required> <option value="f">foo</option> <option value="b">bar</option> <option value="w">whiz</option> @@ -1909,7 +1909,7 @@ Options: <select multiple="multiple" name="options" required> """<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="multiple" name="options" required> +<li>Options: <select multiple name="options" required> <option value="f" selected>foo</option> <option value="b" selected>bar</option> <option value="w">whiz</option> @@ -1938,7 +1938,7 @@ Password: <input type="password" name="password" required /></li> 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="multiple" name="options" required> +<li>Options: <select multiple name="options" required> <option value="f">foo</option> <option value="b" selected>bar</option> <option value="w" selected>whiz</option> @@ -1949,7 +1949,7 @@ Password: <input type="password" name="password" required /></li> 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="multiple" name="options" required> +<li>Options: <select multiple name="options" required> <option value="f" selected>foo</option> <option value="b" selected>bar</option> <option value="w">whiz</option> diff --git a/tests/forms_tests/tests/tests.py b/tests/forms_tests/tests/tests.py index a54ad09c26..bf0d588f53 100644 --- a/tests/forms_tests/tests/tests.py +++ b/tests/forms_tests/tests/tests.py @@ -116,13 +116,13 @@ class ModelFormCallableModelDefault(TestCase): <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="multiple" name="multi_choice" id="id_multi_choice" required> +<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="multiple" name="multi_choice_int" id="id_multi_choice_int" required> +<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> @@ -152,14 +152,14 @@ class ModelFormCallableModelDefault(TestCase): <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="multiple" name="multi_choice" id="id_multi_choice" required> +<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="multiple" name="multi_choice_int" id="id_multi_choice_int" required> +<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> diff --git a/tests/forms_tests/widget_tests/test_multiwidget.py b/tests/forms_tests/widget_tests/test_multiwidget.py index f452ad2ad3..bce806231d 100644 --- a/tests/forms_tests/widget_tests/test_multiwidget.py +++ b/tests/forms_tests/widget_tests/test_multiwidget.py @@ -155,7 +155,7 @@ class MultiWidgetTest(WidgetTest): self.check_html(widget, 'name', 'some text,JP,2007-04-25 06:24:00', html=( """ <input type="text" name="name_0" value="some text" /> - <select multiple="multiple" name="name_1"> + <select multiple name="name_1"> <option value="J" selected>John</option> <option value="P" selected>Paul</option> <option value="G">George</option> diff --git a/tests/forms_tests/widget_tests/test_selectmultiple.py b/tests/forms_tests/widget_tests/test_selectmultiple.py index 149fae6d4b..08606a18c4 100644 --- a/tests/forms_tests/widget_tests/test_selectmultiple.py +++ b/tests/forms_tests/widget_tests/test_selectmultiple.py @@ -15,7 +15,7 @@ class SelectMultipleTest(WidgetTest): def test_render_selected(self): self.check_html(self.widget(choices=self.beatles), 'beatles', ['J'], html=( - """<select multiple="multiple" name="beatles"> + """<select multiple name="beatles"> <option value="J" selected>John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -25,7 +25,7 @@ class SelectMultipleTest(WidgetTest): def test_render_multiple_selected(self): self.check_html(self.widget(choices=self.beatles), 'beatles', ['J', 'P'], html=( - """<select multiple="multiple" name="beatles"> + """<select multiple name="beatles"> <option value="J" selected>John</option> <option value="P" selected>Paul</option> <option value="G">George</option> @@ -38,7 +38,7 @@ class SelectMultipleTest(WidgetTest): If the value is None, none of the options are selected. """ self.check_html(self.widget(choices=self.beatles), 'beatles', None, html=( - """<select multiple="multiple" name="beatles"> + """<select multiple name="beatles"> <option value="J">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -52,7 +52,7 @@ class SelectMultipleTest(WidgetTest): of the options are selected. """ self.check_html(self.widget(choices=self.beatles), 'beatles', ['John'], html=( - """<select multiple="multiple" name="beatles"> + """<select multiple name="beatles"> <option value="J">John</option> <option value="P">Paul</option> <option value="G">George</option> @@ -65,7 +65,7 @@ class SelectMultipleTest(WidgetTest): Multiple options with the same value can be selected (#8103). """ self.check_html(self.widget(choices=self.numeric_choices), 'choices', ['0'], html=( - """<select multiple="multiple" name="choices"> + """<select multiple name="choices"> <option value="0" selected>0</option> <option value="1">1</option> <option value="2">2</option> @@ -80,7 +80,7 @@ class SelectMultipleTest(WidgetTest): ones are selected. """ self.check_html(self.widget(choices=self.beatles), 'beatles', ['J', 'G', 'foo'], html=( - """<select multiple="multiple" name="beatles"> + """<select multiple name="beatles"> <option value="J" selected>John</option> <option value="P">Paul</option> <option value="G" selected>George</option> @@ -92,7 +92,7 @@ class SelectMultipleTest(WidgetTest): choices = [('1', '1'), ('2', '2'), ('3', '3')] self.check_html(self.widget(choices=choices), 'nums', [2], html=( - """<select multiple="multiple" name="nums"> + """<select multiple name="nums"> <option value="1">1</option> <option value="2" selected>2</option> <option value="3">3</option> @@ -100,7 +100,7 @@ class SelectMultipleTest(WidgetTest): )) self.check_html(self.widget(choices=choices), 'nums', ['2'], html=( - """<select multiple="multiple" name="nums"> + """<select multiple name="nums"> <option value="1">1</option> <option value="2" selected>2</option> <option value="3">3</option> @@ -108,7 +108,7 @@ class SelectMultipleTest(WidgetTest): )) self.check_html(self.widget(choices=choices), 'nums', [2], html=( - """<select multiple="multiple" name="nums"> + """<select multiple name="nums"> <option value="1">1</option> <option value="2" selected>2</option> <option value="3">3</option> @@ -121,7 +121,7 @@ class SelectMultipleTest(WidgetTest): ('Group "1"', (('inner1', 'Inner 1'), ('inner2', 'Inner 2'))), )) self.check_html(widget, 'nestchoice', ['outer1', 'inner2'], html=( - """<select multiple="multiple" name="nestchoice"> + """<select multiple name="nestchoice"> <option value="outer1" selected>Outer 1</option> <optgroup label="Group "1""> <option value="inner1">Inner 1</option> diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 7af2aff825..b6ce55cf40 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -1168,7 +1168,7 @@ class ModelFormBasicTests(TestCase): <option value="%s">Mike Royko</option> </select></li> <li>Article: <textarea rows="10" cols="40" name="article" required></textarea></li> -<li>Categories: <select multiple="multiple" name="categories"> +<li>Categories: <select multiple name="categories"> <option value="%s" selected>Entertainment</option> <option value="%s" selected>It's a test</option> <option value="%s">Third test</option> @@ -1210,7 +1210,7 @@ class ModelFormBasicTests(TestCase): <option value="%s" selected>Mike Royko</option> </select></li> <li>Article: <textarea rows="10" cols="40" name="article" required>Hello.</textarea></li> -<li>Categories: <select multiple="multiple" name="categories"> +<li>Categories: <select multiple name="categories"> <option value="%s">Entertainment</option> <option value="%s">It's a test</option> <option value="%s">Third test</option> @@ -1258,7 +1258,7 @@ class ModelFormBasicTests(TestCase): """<li><label for="id_headline">Headline:</label> <input id="id_headline" type="text" name="headline" maxlength="50" required /></li> <li><label for="id_categories">Categories:</label> -<select multiple="multiple" name="categories" id="id_categories"> +<select multiple name="categories" id="id_categories"> <option value="%d" selected>Entertainment</option> <option value="%d" selected>It&39;s a test</option> <option value="%d">Third test</option> @@ -1327,7 +1327,7 @@ class ModelFormBasicTests(TestCase): <option value="%s">Mike Royko</option> </select></td></tr> <tr><th>Article:</th><td><textarea rows="10" cols="40" name="article" required></textarea></td></tr> -<tr><th>Categories:</th><td><select multiple="multiple" name="categories"> +<tr><th>Categories:</th><td><select multiple name="categories"> <option value="%s">Entertainment</option> <option value="%s">It's a test</option> <option value="%s">Third test</option> @@ -1357,7 +1357,7 @@ class ModelFormBasicTests(TestCase): <option value="%s" selected>Mike Royko</option> </select></li> <li>Article: <textarea rows="10" cols="40" name="article" required>Hello.</textarea></li> -<li>Categories: <select multiple="multiple" name="categories"> +<li>Categories: <select multiple name="categories"> <option value="%s" selected>Entertainment</option> <option value="%s">It's a test</option> <option value="%s">Third test</option> @@ -1501,7 +1501,7 @@ class ModelFormBasicTests(TestCase): <option value="%s">Mike Royko</option> </select></li> <li>Article: <textarea rows="10" cols="40" name="article" required></textarea></li> -<li>Categories: <select multiple="multiple" name="categories"> +<li>Categories: <select multiple name="categories"> <option value="%s">Entertainment</option> <option value="%s">It's a test</option> <option value="%s">Third test</option> @@ -1527,7 +1527,7 @@ class ModelFormBasicTests(TestCase): <option value="%s">Mike Royko</option> </select></li> <li>Article: <textarea rows="10" cols="40" name="article" required></textarea></li> -<li>Categories: <select multiple="multiple" name="categories"> +<li>Categories: <select multiple name="categories"> <option value="%s">Entertainment</option> <option value="%s">It's a test</option> <option value="%s">Third test</option> @@ -2681,7 +2681,7 @@ class OtherModelFormTests(TestCase): form.as_p(), """<p><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" maxlength="50" required /></p> <p><label for="id_colours">Colours:</label> - <select multiple="multiple" name="colours" id="id_colours" required> + <select multiple name="colours" id="id_colours" required> <option value="%(blue_pk)s">Blue</option> </select></p>""" % {'blue_pk': colour.pk}) |
