From 445e0a5c3e40dbcfd866b4594371b0fa49fdc223 Mon Sep 17 00:00:00 2001
From: Joseph Kocherhans <joseph@jkocherhans.com>
Date: Tue, 23 Feb 2010 23:37:45 +0000
Subject: [PATCH] Fixed #9336. Changed CheckboxInput to render 'True' and
 'False' input strings as checked or not instead of as a value attribute.
 Thanks, bthomas.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12556 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/forms/widgets.py              |  7 ++++++-
 tests/regressiontests/forms/forms.py | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index 57bdea17f4..ee1966b76f 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -382,7 +382,12 @@ class CheckboxInput(Widget):
             # A missing value means False because HTML form submission does not
             # send results for unselected checkboxes.
             return False
-        return super(CheckboxInput, self).value_from_datadict(data, files, name)
+        value = data.get(name)
+        # Translate true and false strings to boolean values.
+        values =  {'true': True, 'false': False}
+        if isinstance(value, basestring):
+            value = values.get(value.lower(), value)
+        return value
 
     def _has_changed(self, initial, data):
         # Sometimes data or initial could be None or u'' which should be the
diff --git a/tests/regressiontests/forms/forms.py b/tests/regressiontests/forms/forms.py
index c4ea28f850..bb58eaa982 100644
--- a/tests/regressiontests/forms/forms.py
+++ b/tests/regressiontests/forms/forms.py
@@ -295,6 +295,24 @@ attribute in the Form gets precedence.
 >>> print f['get_spam']
 <input checked="checked" type="checkbox" name="get_spam" />
 
+'True' or 'true' should be rendered without a value attribute
+>>> f = SignupForm({'email': 'test@example.com', 'get_spam': 'True'}, auto_id=False)
+>>> print f['get_spam']
+<input checked="checked" type="checkbox" name="get_spam" />
+
+>>> f = SignupForm({'email': 'test@example.com', 'get_spam': 'true'}, auto_id=False)
+>>> print f['get_spam']
+<input checked="checked" type="checkbox" name="get_spam" />
+
+A value of 'False' or 'false' should be rendered unchecked
+>>> f = SignupForm({'email': 'test@example.com', 'get_spam': 'False'}, auto_id=False)
+>>> print f['get_spam']
+<input type="checkbox" name="get_spam" />
+
+>>> f = SignupForm({'email': 'test@example.com', 'get_spam': 'false'}, auto_id=False)
+>>> print f['get_spam']
+<input type="checkbox" name="get_spam" />
+
 Any Field can have a Widget class passed to its constructor:
 >>> class ContactForm(Form):
 ...     subject = CharField()