From 19e54084dc7d85d0bf190e0d79575126c5d29a50 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Mon, 21 Nov 2011 10:11:06 +0000 Subject: [PATCH] Fixed #17114 -- Handled integer values 0 and 1 for checkboxes like other integer values, not like False and True. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17132 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/widgets.py | 9 ++++++--- tests/regressiontests/forms/tests/widgets.py | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/django/forms/widgets.py b/django/forms/widgets.py index f756957960..57a6b4566a 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -464,11 +464,14 @@ class TimeInput(Input): return super(TimeInput, self)._has_changed(self._format_value(initial), data) class CheckboxInput(Widget): - def __init__(self, attrs=None, check_test=bool): + def __init__(self, attrs=None, check_test=None): super(CheckboxInput, self).__init__(attrs) # check_test is a callable that takes a value and returns True # if the checkbox should be checked for that value. - self.check_test = check_test + if check_test is None: + self.check_test = lambda v: not (v is False or v is None or v == '') + else: + self.check_test = check_test def render(self, name, value, attrs=None): final_attrs = self.build_attrs(attrs, type='checkbox', name=name) @@ -478,7 +481,7 @@ class CheckboxInput(Widget): result = False if result: final_attrs['checked'] = 'checked' - if value not in ('', True, False, None): + if not (value is True or value is False or value is None or value == ''): # Only add the 'value' attribute if a value is non-empty. final_attrs['value'] = force_unicode(value) return mark_safe(u'' % flatatt(final_attrs)) diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py index b567ea370e..ac78ad701b 100644 --- a/tests/regressiontests/forms/tests/widgets.py +++ b/tests/regressiontests/forms/tests/widgets.py @@ -195,6 +195,10 @@ class FormsWidgetTestCase(TestCase): self.assertEqual(w.render('is_cool', False, attrs={'class': 'pretty'}), u'') + # regression for #17114 + self.assertEqual(w.render('is_cool', 0), u'') + self.assertEqual(w.render('is_cool', 1), u'') + # You can also pass 'attrs' to the constructor: w = CheckboxInput(attrs={'class': 'pretty'}) self.assertEqual(w.render('is_cool', ''), u'')