Fixed #16820 -- Treated '0' value as True for checkbox inputs
Thanks Dan Fairs for the report and the initial patch.
This commit is contained in:
parent
90c7656466
commit
be29329ccd
|
@ -528,7 +528,7 @@ class CheckboxInput(Widget):
|
||||||
values = {'true': True, 'false': False}
|
values = {'true': True, 'false': False}
|
||||||
if isinstance(value, six.string_types):
|
if isinstance(value, six.string_types):
|
||||||
value = values.get(value.lower(), value)
|
value = values.get(value.lower(), value)
|
||||||
return value
|
return bool(value)
|
||||||
|
|
||||||
def _has_changed(self, initial, data):
|
def _has_changed(self, initial, data):
|
||||||
# Sometimes data or initial could be None or '' which should be the
|
# Sometimes data or initial could be None or '' which should be the
|
||||||
|
|
|
@ -269,6 +269,11 @@ class FormsTestCase(TestCase):
|
||||||
f = SignupForm({'email': 'test@example.com', 'get_spam': 'false'}, auto_id=False)
|
f = SignupForm({'email': 'test@example.com', 'get_spam': 'false'}, auto_id=False)
|
||||||
self.assertHTMLEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />')
|
self.assertHTMLEqual(str(f['get_spam']), '<input type="checkbox" name="get_spam" />')
|
||||||
|
|
||||||
|
# A value of '0' should be interpreted as a True value (#16820)
|
||||||
|
f = SignupForm({'email': 'test@example.com', 'get_spam': '0'})
|
||||||
|
self.assertTrue(f.is_valid())
|
||||||
|
self.assertTrue(f.cleaned_data.get('get_spam'))
|
||||||
|
|
||||||
def test_widget_output(self):
|
def test_widget_output(self):
|
||||||
# Any Field can have a Widget class passed to its constructor:
|
# Any Field can have a Widget class passed to its constructor:
|
||||||
class ContactForm(Form):
|
class ContactForm(Form):
|
||||||
|
|
|
@ -225,6 +225,10 @@ class FormsWidgetTestCase(TestCase):
|
||||||
# checkboxes).
|
# checkboxes).
|
||||||
self.assertFalse(w.value_from_datadict({}, {}, 'testing'))
|
self.assertFalse(w.value_from_datadict({}, {}, 'testing'))
|
||||||
|
|
||||||
|
value = w.value_from_datadict({'testing': '0'}, {}, 'testing')
|
||||||
|
self.assertIsInstance(value, bool)
|
||||||
|
self.assertTrue(value)
|
||||||
|
|
||||||
self.assertFalse(w._has_changed(None, None))
|
self.assertFalse(w._has_changed(None, None))
|
||||||
self.assertFalse(w._has_changed(None, ''))
|
self.assertFalse(w._has_changed(None, ''))
|
||||||
self.assertFalse(w._has_changed('', None))
|
self.assertFalse(w._has_changed('', None))
|
||||||
|
|
Loading…
Reference in New Issue