Fixed #28075 -- Prevented ChoiceWidget from localizing option values.

This commit is contained in:
Jon Dufresne 2017-04-21 09:14:40 -07:00 committed by Tim Graham
parent 87f9a3c5b2
commit 581879a510
5 changed files with 97 additions and 1 deletions

View File

@ -594,7 +594,7 @@ class ChoiceWidget(Widget):
option_attrs['id'] = self.id_for_label(option_attrs['id'], index) option_attrs['id'] = self.id_for_label(option_attrs['id'], index)
return { return {
'name': name, 'name': name,
'value': value, 'value': str(value),
'label': label, 'label': label,
'selected': selected, 'selected': selected,
'index': index, 'index': index,

View File

@ -45,3 +45,7 @@ Bugfixes
* Fixed exception reraising in ORM query execution when ``cursor.execute()`` * Fixed exception reraising in ORM query execution when ``cursor.execute()``
fails and the subsequent ``cursor.close()`` also fails (:ticket:`28091`). 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`).

View File

@ -1,5 +1,8 @@
import datetime
from django import forms from django import forms
from django.forms import CheckboxSelectMultiple from django.forms import CheckboxSelectMultiple
from django.test import override_settings
from .base import WidgetTest from .base import WidgetTest
@ -149,6 +152,34 @@ class CheckboxSelectMultipleTest(WidgetTest):
""" """
self.check_html(widget, 'letters', ['a', 'c'], html=html) 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 = """
<ul>
<li><label><input type="checkbox" name="numbers" value="1" /> One</label></li>
<li><label><input type="checkbox" name="numbers" value="1000" /> One thousand</label></li>
<li><label><input type="checkbox" name="numbers" value="1000000" /> One million</label></li>
</ul>
"""
self.check_html(self.widget(choices=choices), 'numbers', None, html=html)
choices = [
(datetime.time(0, 0), 'midnight'),
(datetime.time(12, 0), 'noon'),
]
html = """
<ul>
<li><label><input type="checkbox" name="times" value="00:00:00" /> midnight</label></li>
<li><label><input type="checkbox" name="times" value="12:00:00" /> noon</label></li>
</ul>
"""
self.check_html(self.widget(choices=choices), 'times', None, html=html)
def test_use_required_attribute(self): def test_use_required_attribute(self):
widget = self.widget(choices=self.beatles) widget = self.widget(choices=self.beatles)
# Always False because browser validation would require all checkboxes # Always False because browser validation would require all checkboxes

View File

@ -1,4 +1,7 @@
import datetime
from django.forms import RadioSelect from django.forms import RadioSelect
from django.test import override_settings
from .base import WidgetTest from .base import WidgetTest
@ -99,3 +102,31 @@ class RadioSelectTest(WidgetTest):
</ul> </ul>
""" """
self.check_html(self.widget(choices=self.beatles), 'beatle', 'J', attrs={'class': 'bar'}, html=html) 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 = """
<ul>
<li><label><input type="radio" name="number" value="1" /> One</label></li>
<li><label><input type="radio" name="number" value="1000" /> One thousand</label></li>
<li><label><input type="radio" name="number" value="1000000" /> One million</label></li>
</ul>
"""
self.check_html(self.widget(choices=choices), 'number', None, html=html)
choices = [
(datetime.time(0, 0), 'midnight'),
(datetime.time(12, 0), 'noon'),
]
html = """
<ul>
<li><label><input type="radio" name="time" value="00:00:00" /> midnight</label></li>
<li><label><input type="radio" name="time" value="12:00:00" /> noon</label></li>
</ul>
"""
self.check_html(self.widget(choices=choices), 'time', None, html=html)

View File

@ -1,6 +1,8 @@
import copy import copy
import datetime
from django.forms import Select from django.forms import Select
from django.test import override_settings
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from .base import WidgetTest from .base import WidgetTest
@ -218,6 +220,34 @@ class SelectTest(WidgetTest):
</select>""" </select>"""
)) ))
@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 = """
<select name="number">
<option value="1">One</option>
<option value="1000">One thousand</option>
<option value="1000000">One million</option>
</select>
"""
self.check_html(self.widget(choices=choices), 'number', None, html=html)
choices = [
(datetime.time(0, 0), 'midnight'),
(datetime.time(12, 0), 'noon'),
]
html = """
<select name="time">
<option value="00:00:00">midnight</option>
<option value="12:00:00">noon</option>
</select>
"""
self.check_html(self.widget(choices=choices), 'time', None, html=html)
def test_options(self): def test_options(self):
options = list(self.widget(choices=self.beatles).options( options = list(self.widget(choices=self.beatles).options(
'name', ['J'], attrs={'class': 'super'}, 'name', ['J'], attrs={'class': 'super'},