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'},