Commit be29329c authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #16820 -- Treated '0' value as True for checkbox inputs

Thanks Dan Fairs for the report and the initial patch.
parent 90c76564
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -528,7 +528,7 @@ class CheckboxInput(Widget):
        values = {'true': True, 'false': False}
        if isinstance(value, six.string_types):
            value = values.get(value.lower(), value)
        return value
        return bool(value)

    def _has_changed(self, initial, data):
        # Sometimes data or initial could be None or '' which should be the
+5 −0
Original line number Diff line number Diff line
@@ -269,6 +269,11 @@ class FormsTestCase(TestCase):
        f = SignupForm({'email': 'test@example.com', 'get_spam': 'false'}, auto_id=False)
        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):
        # Any Field can have a Widget class passed to its constructor:
        class ContactForm(Form):
+4 −0
Original line number Diff line number Diff line
@@ -225,6 +225,10 @@ class FormsWidgetTestCase(TestCase):
        # checkboxes).
        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, ''))
        self.assertFalse(w._has_changed('', None))