Skip to content

Instantly share code, notes, and snippets.

@jordinl-zz
Created September 22, 2011 11:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jordinl-zz/1234612 to your computer and use it in GitHub Desktop.
Save jordinl-zz/1234612 to your computer and use it in GitHub Desktop.
Add field validations to the model
from django.db import models
from django.core.exceptions import ValidationError
from django.forms import ModelForm
class CleanModel(models.Model):
""" Abstract class that adds field validations """
def clean_fields(self, exclude):
errors = {}
try:
super(CleanModel, self).clean_fields(exclude)
except ValidationError, e:
errors = e.update_error_dict(errors)
for f in self._meta.fields:
if hasattr(self, "clean_%s" % f.name):
try:
value = getattr(self, "clean_%s" % f.name)()
setattr(self, f.name, value)
except ValidationError, e:
errors = ValidationError({ f.name: e.messages }).update_error_dict(errors)
if errors:
raise ValidationError(errors)
def is_valid(self):
return not self.errors
@property
def errors(self):
try:
self.full_clean()
except ValidationError, e:
return e.update_error_dict({})
return []
class MyModel(CleanModel):
""" Example model with field validations """
my_field = models.CharField(max_length=100)
def clean_my_field(self):
if not self.my_field or len(self.my_field) < 10:
raise ValidationError("My Field is too short")
return self.my_field
class MyForm(ModelForm):
""" Example form with field validations in the model """
class Meta:
model = MyModel
my_object = MyModel()
my_object.is_valid()
#=> False
my_object.errors
#=> {'my_field': [u'This field cannot be null.', u'My Field is too short']}
my_object = MyModel(my_field='a')
my_object.is_valid()
#=> False
my_object.errors
#=> {'my_field': [u'My Field is too short']}
my_object = MyModel(my_field="i'm very valid")
my_object.is_valid()
#=> True
my_form = MyForm({})
my_form.is_valid()
#=> False
my_form.errors
#=> {'my_field': [u'This field is required.', u'My Field is too short']}
my_form = MyForm({ 'my_field': "I'm very valid" })
My_form.is_valid()
#=> True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment