Single CPF but with blank = True

3

If I define

cpf = models.CharField(max_length=11, unique=True, null=True, blank=True)

It happens that if I leave a record with the null value, when I try to save a second record, it accuses the duplicate value.

How to circumvent this situation?

    
asked by anonymous 30.07.2015 / 23:07

1 answer

1

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)
    
31.07.2015 / 17:18