from django import forms def clean_unique(form, field, exclude_initial=True, format="The %(field)s %(value)s has already been taken."): value = form.cleaned_data.get(field) if value: qs = form._meta.model._default_manager.filter(**{field:value}) if exclude_initial and form.initial: initial_value = form.initial.get(field) qs = qs.exclude(**{field:initial_value}) if qs.count() > 0: raise forms.ValidationError(format % {'field':field, 'value':value}) return value # Usage: class DeployForm(forms.ModelForm): """We want both the slug and cname fields to be unique""" class Meta: model = Website fields = ['slug', 'cname'] def clean_slug(self): return clean_unique(self, 'slug') def clean_cname(self): return clean_unique(self, 'cname')