diff --git a/gluon/tests/test_validators.py b/gluon/tests/test_validators.py index 77a7e6b5..e534fbd8 100644 --- a/gluon/tests/test_validators.py +++ b/gluon/tests/test_validators.py @@ -235,6 +235,11 @@ class TestValidators(unittest.TestCase): self.assertEqual(sorted(rtn), [('%d' % george_id, 'george'), ('%d' % costanza_id, 'costanza')]) rtn = IS_IN_DB(db, db.person.id, db.person.name, error_message='oops', sort=True).options(zero=True) self.assertEqual(rtn, [('', ''), ('%d' % costanza_id, 'costanza'), ('%d' % george_id, 'george')]) + # Test None + rtn = IS_IN_DB(db, 'person.id', '%(name)s', error_message='oops')(None) + self.assertEqual(rtn, (None, 'oops')) + rtn = IS_IN_DB(db, 'person.name', '%(name)s', error_message='oops')(None) + self.assertEqual(rtn, (None, 'oops')) # Test using the set it made for options vldtr = IS_IN_DB(db, 'person.name', '%(name)s', error_message='oops') vldtr.options() diff --git a/gluon/validators.py b/gluon/validators.py index 7ace3c5c..90ee8302 100644 --- a/gluon/validators.py +++ b/gluon/validators.py @@ -21,7 +21,7 @@ import urllib import struct import decimal import unicodedata -from gluon._compat import StringIO, long, basestring, unicodeT, to_unicode, urllib_unquote, unichr, to_bytes, PY2, to_unicode, to_native +from gluon._compat import StringIO, long, basestring, unicodeT, to_unicode, urllib_unquote, unichr, to_bytes, PY2, to_unicode, to_native, string_types from gluon.utils import simple_hash, web2py_uuid, DIGEST_ALG_BY_SIZE from pydal.objects import Field, FieldVirtual, FieldMethod from functools import reduce @@ -659,7 +659,7 @@ class IS_IN_DB(Validator): return (values, None) else: if field.type in ('id', 'integer'): - if isinstance(value, (int, long)) or value.isdigit(): + if isinstance(value, (int, long)) or (isinstance(value, string_types) and value.isdigit()): value = int(value) elif self.auto_add: value = self.maybe_add(table, self.fieldnames[0], value)