django1/tests/modeltests/validation/models.py

178 lines
3.9 KiB
Python

"""
31. Validation
This is an experimental feature!
Each model instance has a validate() method that returns a dictionary of
validation errors in the instance's fields. This method has a side effect
of converting each field to its appropriate Python data type.
"""
from django.db import models
class Person(models.Model):
is_child = models.BooleanField()
name = models.CharField(max_length=20)
birthdate = models.DateField()
favorite_moment = models.DateTimeField()
email = models.EmailField()
best_time = models.TimeField()
def __unicode__(self):
return self.name
__test__ = {'API_TESTS':"""
>>> import datetime
>>> valid_params = {
... 'is_child': True,
... 'name': 'John',
... 'birthdate': datetime.date(2000, 5, 3),
... 'favorite_moment': datetime.datetime(2002, 4, 3, 13, 23),
... 'email': 'john@example.com',
... 'best_time': datetime.time(16, 20),
... }
>>> p = Person(**valid_params)
>>> p.validate()
{}
>>> p = Person(**dict(valid_params, id='23'))
>>> p.validate()
{}
>>> p.id
23
>>> p = Person(**dict(valid_params, id='foo'))
>>> p.validate()['id']
[u'This value must be an integer.']
>>> p = Person(**dict(valid_params, id=None))
>>> p.validate()
{}
>>> repr(p.id)
'None'
>>> p = Person(**dict(valid_params, is_child='t'))
>>> p.validate()
{}
>>> p.is_child
True
>>> p = Person(**dict(valid_params, is_child='f'))
>>> p.validate()
{}
>>> p.is_child
False
>>> p = Person(**dict(valid_params, is_child=True))
>>> p.validate()
{}
>>> p.is_child
True
>>> p = Person(**dict(valid_params, is_child=False))
>>> p.validate()
{}
>>> p.is_child
False
>>> p = Person(**dict(valid_params, is_child='foo'))
>>> p.validate()['is_child']
[u'This value must be either True or False.']
>>> p = Person(**dict(valid_params, name=u'Jose'))
>>> p.validate()
{}
>>> p.name
u'Jose'
>>> p = Person(**dict(valid_params, name=227))
>>> p.validate()
{}
>>> p.name
u'227'
>>> p = Person(**dict(valid_params, birthdate=datetime.date(2000, 5, 3)))
>>> p.validate()
{}
>>> p.birthdate
datetime.date(2000, 5, 3)
>>> p = Person(**dict(valid_params, birthdate=datetime.datetime(2000, 5, 3)))
>>> p.validate()
{}
>>> p.birthdate
datetime.date(2000, 5, 3)
>>> p = Person(**dict(valid_params, birthdate='2000-05-03'))
>>> p.validate()
{}
>>> p.birthdate
datetime.date(2000, 5, 3)
>>> p = Person(**dict(valid_params, birthdate='2000-5-3'))
>>> p.validate()
{}
>>> p.birthdate
datetime.date(2000, 5, 3)
>>> p = Person(**dict(valid_params, birthdate='foo'))
>>> p.validate()['birthdate']
[u'Enter a valid date in YYYY-MM-DD format.']
>>> p = Person(**dict(valid_params, favorite_moment=datetime.datetime(2002, 4, 3, 13, 23)))
>>> p.validate()
{}
>>> p.favorite_moment
datetime.datetime(2002, 4, 3, 13, 23)
>>> p = Person(**dict(valid_params, favorite_moment=datetime.datetime(2002, 4, 3)))
>>> p.validate()
{}
>>> p.favorite_moment
datetime.datetime(2002, 4, 3, 0, 0)
>>> p = Person(**dict(valid_params, best_time='16:20:00'))
>>> p.validate()
{}
>>> p.best_time
datetime.time(16, 20)
>>> p = Person(**dict(valid_params, best_time='16:20'))
>>> p.validate()
{}
>>> p.best_time
datetime.time(16, 20)
>>> p = Person(**dict(valid_params, best_time='bar'))
>>> p.validate()['best_time']
[u'Enter a valid time in HH:MM[:ss[.uuuuuu]] format.']
>>> p = Person(**dict(valid_params, email='john@example.com'))
>>> p.validate()
{}
>>> p.email
'john@example.com'
>>> p = Person(**dict(valid_params, email=u'john@example.com'))
>>> p.validate()
{}
>>> p.email
u'john@example.com'
>>> p = Person(**dict(valid_params, email=22))
>>> p.validate()['email']
[u'Enter a valid e-mail address.']
# Make sure that Date and DateTime return validation errors and don't raise Python errors.
>>> p = Person(name='John Doe', is_child=True, email='abc@def.com')
>>> errors = p.validate()
>>> errors['favorite_moment']
[u'This field is required.']
>>> errors['birthdate']
[u'This field is required.']
>>> errors['best_time']
[u'This field is required.']
"""}