From 3efb2ab75ed167b4ac2ae9fb931b4ffffd66d215 Mon Sep 17 00:00:00 2001 From: mtredinnick Date: Fri, 29 Aug 2008 02:40:56 +0000 Subject: [PATCH] Fixed #8101 -- Allow the strings '1' and '0' as filter values for boolean fields (the latter was causing problems). This allows these values in URLs (e.g. the admin filtering). Not an ideal solution to the problem, but will do the job for the time being. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8691 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/__init__.py | 18 ++++++++++++++++++ tests/regressiontests/model_fields/tests.py | 26 ++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index d4f3c6f3..4ddf901e 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -362,6 +362,15 @@ class BooleanField(Field): raise exceptions.ValidationError( _("This value must be either True or False.")) + def get_db_prep_lookup(self, lookup_type, value): + # Special-case handling for filters coming from a web request (e.g. the + # admin interface). Only works for scalar values (not lists). If you're + # passing in a list, you might as well make things the right type when + # constructing the list. + if value in ('1', '0'): + value = bool(int(value)) + return super(BooleanField, self).get_db_prep_lookup(lookup_type, value) + def get_db_prep_value(self, value): if value is None: return None @@ -693,6 +702,15 @@ class NullBooleanField(Field): raise exceptions.ValidationError( _("This value must be either None, True or False.")) + def get_db_prep_lookup(self, lookup_type, value): + # Special-case handling for filters coming from a web request (e.g. the + # admin interface). Only works for scalar values (not lists). If you're + # passing in a list, you might as well make things the right type when + # constructing the list. + if value in ('1', '0'): + value = bool(int(value)) + return super(NullBooleanField, self).get_db_prep_lookup(lookup_type, value) + def get_db_prep_value(self, value): if value is None: return None diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py index 0e67c60a..80ff4bad 100644 --- a/tests/regressiontests/model_fields/tests.py +++ b/tests/regressiontests/model_fields/tests.py @@ -45,5 +45,31 @@ datetime.time(1, 2, 3, 4) >>> f.to_python('01:02:03.999999') datetime.time(1, 2, 3, 999999) +# Boolean and null boolean fields +>>> f = BooleanField() +>>> for val in (True, '1', 1): +... f.get_db_prep_lookup('exact', val) +[True] +[True] +[True] +>>> for val in (False, '0', 0): +... f.get_db_prep_lookup('exact', val) +[False] +[False] +[False] + +>>> f = NullBooleanField() +>>> for val in (True, '1', 1): +... f.get_db_prep_lookup('exact', val) +[True] +[True] +[True] +>>> for val in (False, '0', 0): +... f.get_db_prep_lookup('exact', val) +[False] +[False] +[False] +>>> f.get_db_prep_lookup('exact', None) +[None] """ -- 2.11.4.GIT