diff --git a/django/forms/widgets.py b/django/forms/widgets.py index bb200dcc87..e284fd8f5d 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -594,7 +594,7 @@ class ChoiceWidget(Widget): option_attrs['id'] = self.id_for_label(option_attrs['id'], index) return { 'name': name, - 'value': value, + 'value': str(value), 'label': label, 'selected': selected, 'index': index, diff --git a/docs/releases/1.11.1.txt b/docs/releases/1.11.1.txt index f29e23785f..91d8854424 100644 --- a/docs/releases/1.11.1.txt +++ b/docs/releases/1.11.1.txt @@ -45,3 +45,7 @@ Bugfixes * Fixed exception reraising in ORM query execution when ``cursor.execute()`` fails and the subsequent ``cursor.close()`` also fails (:ticket:`28091`). + +* Fixed a regression where ``CheckboxSelectMultiple``, ``NullBooleanSelect``, + ``RadioSelect``, ``SelectMultiple``, and ``Select`` localized option values + (:ticket:`28075`). diff --git a/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py b/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py index 6ec5c78803..239f80da47 100644 --- a/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py +++ b/tests/forms_tests/widget_tests/test_checkboxselectmultiple.py @@ -1,5 +1,8 @@ +import datetime + from django import forms from django.forms import CheckboxSelectMultiple +from django.test import override_settings from .base import WidgetTest @@ -149,6 +152,34 @@ class CheckboxSelectMultipleTest(WidgetTest): """ self.check_html(widget, 'letters', ['a', 'c'], html=html) + @override_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=True) + def test_doesnt_localize_input_value(self): + choices = [ + (1, 'One'), + (1000, 'One thousand'), + (1000000, 'One million'), + ] + html = """ + + """ + self.check_html(self.widget(choices=choices), 'numbers', None, html=html) + + choices = [ + (datetime.time(0, 0), 'midnight'), + (datetime.time(12, 0), 'noon'), + ] + html = """ + + """ + self.check_html(self.widget(choices=choices), 'times', None, html=html) + def test_use_required_attribute(self): widget = self.widget(choices=self.beatles) # Always False because browser validation would require all checkboxes diff --git a/tests/forms_tests/widget_tests/test_radioselect.py b/tests/forms_tests/widget_tests/test_radioselect.py index 8ef3a17da5..05f980eb36 100644 --- a/tests/forms_tests/widget_tests/test_radioselect.py +++ b/tests/forms_tests/widget_tests/test_radioselect.py @@ -1,4 +1,7 @@ +import datetime + from django.forms import RadioSelect +from django.test import override_settings from .base import WidgetTest @@ -99,3 +102,31 @@ class RadioSelectTest(WidgetTest): """ self.check_html(self.widget(choices=self.beatles), 'beatle', 'J', attrs={'class': 'bar'}, html=html) + + @override_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=True) + def test_doesnt_localize_input_value(self): + choices = [ + (1, 'One'), + (1000, 'One thousand'), + (1000000, 'One million'), + ] + html = """ + + """ + self.check_html(self.widget(choices=choices), 'number', None, html=html) + + choices = [ + (datetime.time(0, 0), 'midnight'), + (datetime.time(12, 0), 'noon'), + ] + html = """ + + """ + self.check_html(self.widget(choices=choices), 'time', None, html=html) diff --git a/tests/forms_tests/widget_tests/test_select.py b/tests/forms_tests/widget_tests/test_select.py index 23d6126810..047d007564 100644 --- a/tests/forms_tests/widget_tests/test_select.py +++ b/tests/forms_tests/widget_tests/test_select.py @@ -1,6 +1,8 @@ import copy +import datetime from django.forms import Select +from django.test import override_settings from django.utils.safestring import mark_safe from .base import WidgetTest @@ -218,6 +220,34 @@ class SelectTest(WidgetTest): """ )) + @override_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=True) + def test_doesnt_localize_option_value(self): + choices = [ + (1, 'One'), + (1000, 'One thousand'), + (1000000, 'One million'), + ] + html = """ + + """ + self.check_html(self.widget(choices=choices), 'number', None, html=html) + + choices = [ + (datetime.time(0, 0), 'midnight'), + (datetime.time(12, 0), 'noon'), + ] + html = """ + + """ + self.check_html(self.widget(choices=choices), 'time', None, html=html) + def test_options(self): options = list(self.widget(choices=self.beatles).options( 'name', ['J'], attrs={'class': 'super'},