Commit 9350d1d5 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #17976 -- Made forms.BooleanField pickleable.

This was a regression in Django 1.4.
Thanks bronger for the report and claudep for the patch.
parent 02a5b41d
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -487,15 +487,18 @@ class TimeInput(Input):
            pass
        return super(TimeInput, self)._has_changed(self._format_value(initial), data)


# Defined at module level so that CheckboxInput is picklable (#17976)
def boolean_check(v):
    return not (v is False or v is None or v == '')


class CheckboxInput(Widget):
    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.
        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
        self.check_test = boolean_check if check_test is None else check_test

    def render(self, name, value, attrs=None):
        final_attrs = self.build_attrs(attrs, type='checkbox', name=name)
+4 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ Other than that, the Field subclasses have class-specific options for
__init__(). For example, CharField has a max_length option.
"""
import datetime
import pickle
import re
import os
import warnings
@@ -690,6 +691,9 @@ class FieldsTests(SimpleTestCase):
        self.assertEqual(False, f.clean('false'))
        self.assertEqual(False, f.clean('FaLsE'))

    def test_boolean_picklable(self):
        self.assertIsInstance(pickle.loads(pickle.dumps(BooleanField())), BooleanField)

    # ChoiceField #################################################################

    def test_choicefield_1(self):