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'')