If you set unique=True
it means that you can not repeat any value, even NULL
. The solution to this problem is to do a check before saving, if there are repeated returns error for the users.
In forms.py
you can do a check as follows:
class SeuModelForm(forms.ModelForm):
class Meta():
model = SeuModel
def __init__(self, *args, **kwargs):
super(SeuModelForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
self.id = kwargs['instance'].id
else:
self.id = None
def clean(self):
cleaned_data = super(SeuModelForm, self).clean()
cpf = cleaned_data.get('cpf')
if cpf:
try:
SeuModel.objects.exclude(id=self.id).get(cpf=cpf)
except (SeuModel.DoesNotExist):
pass
else:
self.add_error('cpf', u'Este CPF já foi cadastrado')
UPDATE:
After doing a search I verified that the problem was not with Django, so the bank accepts yes more than NULL
. To solve this problem in a simpler way, simply return None
if the field has not been filled in.
class SeuModelForm(forms.ModelForm):
class Meta():
model = SeuModel
def clean_cpf(self):
return self.cleaned_data['cpf'] or None
Or even better , directly in the save()
method of the model:
def save(self, *args, **kwargs):
if not self.cpf:
self.cpf = None
super(SeuModel, self).save(*args, **kwargs)