diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 566bdf25d64..e4f89571896 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -649,6 +649,8 @@ class ChoiceWidget(Widget): def format_value(self, value): """Return selected values as a list.""" + if value is None and self.allow_multiple_selected: + return [] if not isinstance(value, (tuple, list)): value = [value] return [str(v) if v is not None else '' for v in value] diff --git a/docs/releases/1.11.12.txt b/docs/releases/1.11.12.txt index 64130c065e4..186c18be58d 100644 --- a/docs/releases/1.11.12.txt +++ b/docs/releases/1.11.12.txt @@ -12,3 +12,7 @@ Bugfixes * Fixed a regression in Django 1.11.8 where combining two annotated ``values_list()`` querysets with ``union()``, ``difference()``, or ``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`) diff --git a/docs/releases/2.0.4.txt b/docs/releases/2.0.4.txt index d27ccf98bc9..c0b51d257f7 100644 --- a/docs/releases/2.0.4.txt +++ b/docs/releases/2.0.4.txt @@ -25,3 +25,7 @@ Bugfixes * Fixed a regression in Django 1.11.8 where combining two annotated ``values_list()`` querysets with ``union()``, ``difference()``, or ``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`) diff --git a/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py b/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py index ef31ce9d366..07e5cca9358 100644 --- a/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py +++ b/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py @@ -32,10 +32,12 @@ class CheckboxSelectMultipleTest(WidgetTest): 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=( """