from django import newforms as forms class CleanUniqueField: """Wrap the clean_XXX method.""" def __init__(self, form, name): try: self.clean = getattr(form, 'clean_' + name) except AttributeError: self.clean = None self.form = form self.name = name def __call__(self): if self.clean: result = self.clean() else: result = self.form.cleaned_data[self.name] queryset = self.form._meta.model.objects if self.form.instance.pk: queryset = queryset.exclude(pk=self.form.instance.pk) try: queryset.get(**{self.name: result}) except self.form._meta.model.DoesNotExist: return result else: raise forms.ValidationError( u'The %s is already in use.' % self.name) class ModelForm(forms.ModelForm): """A hack around the Django ticket #4895.""" def __init__(self, *args, **kwargs): super(ModelForm, self).__init__(*args, **kwargs) for field in self._meta.model._meta.fields: if field.unique and field.name in self.base_fields: setattr(self, 'clean_' + field.name, CleanUniqueField(self, field.name))