mirror of https://github.com/django/django.git
Fixed #29273 -- Prevented initial selection of empty choice in multiple choice widgets.
Regression in b52c73008a
.
This commit is contained in:
parent
d31a248c64
commit
f3b69f9757
|
@ -649,6 +649,8 @@ class ChoiceWidget(Widget):
|
||||||
|
|
||||||
def format_value(self, value):
|
def format_value(self, value):
|
||||||
"""Return selected values as a list."""
|
"""Return selected values as a list."""
|
||||||
|
if value is None and self.allow_multiple_selected:
|
||||||
|
return []
|
||||||
if not isinstance(value, (tuple, list)):
|
if not isinstance(value, (tuple, list)):
|
||||||
value = [value]
|
value = [value]
|
||||||
return [str(v) if v is not None else '' for v in value]
|
return [str(v) if v is not None else '' for v in value]
|
||||||
|
|
|
@ -12,3 +12,7 @@ Bugfixes
|
||||||
* Fixed a regression in Django 1.11.8 where combining two annotated
|
* Fixed a regression in Django 1.11.8 where combining two annotated
|
||||||
``values_list()`` querysets with ``union()``, ``difference()``, or
|
``values_list()`` querysets with ``union()``, ``difference()``, or
|
||||||
``intersection()`` crashed due to mismatching columns (:ticket:`29229`).
|
``intersection()`` crashed due to mismatching columns (:ticket:`29229`).
|
||||||
|
|
||||||
|
* Fixed a regression in Django 1.11 where an empty choice could be initially
|
||||||
|
selected for the ``SelectMultiple`` and ``CheckboxSelectMultiple`` widgets
|
||||||
|
(:ticket:`29273`)
|
||||||
|
|
|
@ -25,3 +25,7 @@ Bugfixes
|
||||||
* Fixed a regression in Django 1.11.8 where combining two annotated
|
* Fixed a regression in Django 1.11.8 where combining two annotated
|
||||||
``values_list()`` querysets with ``union()``, ``difference()``, or
|
``values_list()`` querysets with ``union()``, ``difference()``, or
|
||||||
``intersection()`` crashed due to mismatching columns (:ticket:`29229`).
|
``intersection()`` crashed due to mismatching columns (:ticket:`29229`).
|
||||||
|
|
||||||
|
* Fixed a regression in Django 1.11 where an empty choice could be initially
|
||||||
|
selected for the ``SelectMultiple`` and ``CheckboxSelectMultiple`` widgets
|
||||||
|
(:ticket:`29273`)
|
||||||
|
|
|
@ -32,10 +32,12 @@ class CheckboxSelectMultipleTest(WidgetTest):
|
||||||
|
|
||||||
def test_render_none(self):
|
def test_render_none(self):
|
||||||
"""
|
"""
|
||||||
If the value is None, none of the options are selected.
|
If the value is None, none of the options are selected, even if the
|
||||||
|
choices have an empty option.
|
||||||
"""
|
"""
|
||||||
self.check_html(self.widget(choices=self.beatles), 'beatles', None, html=(
|
self.check_html(self.widget(choices=(('', 'Unknown'),) + self.beatles), 'beatles', None, html=(
|
||||||
"""<ul>
|
"""<ul>
|
||||||
|
<li><label><input type="checkbox" name="beatles" value=""> Unknown</label></li>
|
||||||
<li><label><input type="checkbox" name="beatles" value="J"> John</label></li>
|
<li><label><input type="checkbox" name="beatles" value="J"> John</label></li>
|
||||||
<li><label><input type="checkbox" name="beatles" value="P"> Paul</label></li>
|
<li><label><input type="checkbox" name="beatles" value="P"> Paul</label></li>
|
||||||
<li><label><input type="checkbox" name="beatles" value="G"> George</label></li>
|
<li><label><input type="checkbox" name="beatles" value="G"> George</label></li>
|
||||||
|
|
|
@ -9,7 +9,7 @@ class SelectMultipleTest(WidgetTest):
|
||||||
|
|
||||||
def test_format_value(self):
|
def test_format_value(self):
|
||||||
widget = self.widget(choices=self.numeric_choices)
|
widget = self.widget(choices=self.numeric_choices)
|
||||||
self.assertEqual(widget.format_value(None), [''])
|
self.assertEqual(widget.format_value(None), [])
|
||||||
self.assertEqual(widget.format_value(''), [''])
|
self.assertEqual(widget.format_value(''), [''])
|
||||||
self.assertEqual(widget.format_value([3, 0, 1]), ['3', '0', '1'])
|
self.assertEqual(widget.format_value([3, 0, 1]), ['3', '0', '1'])
|
||||||
|
|
||||||
|
@ -35,10 +35,12 @@ class SelectMultipleTest(WidgetTest):
|
||||||
|
|
||||||
def test_render_none(self):
|
def test_render_none(self):
|
||||||
"""
|
"""
|
||||||
If the value is None, none of the options are selected.
|
If the value is None, none of the options are selected, even if the
|
||||||
|
choices have an empty option.
|
||||||
"""
|
"""
|
||||||
self.check_html(self.widget(choices=self.beatles), 'beatles', None, html=(
|
self.check_html(self.widget(choices=(('', 'Unknown'),) + self.beatles), 'beatles', None, html=(
|
||||||
"""<select multiple name="beatles">
|
"""<select multiple name="beatles">
|
||||||
|
<option value="">Unknown</option>
|
||||||
<option value="J">John</option>
|
<option value="J">John</option>
|
||||||
<option value="P">Paul</option>
|
<option value="P">Paul</option>
|
||||||
<option value="G">George</option>
|
<option value="G">George</option>
|
||||||
|
|
Loading…
Reference in New Issue