How can I allow empty fields in my ModelForm while still using unique = True?

django, django-forms, python

Solution

Essentially, you need to follow the advice in this answer. While Django considers `''` equal to `''` for purposes of uniqueness, it doesn't consider `NULL` equal to `NULL`. So you need to store `NULL` values instead of empty strings.

Change the field to allow `NULL`, by adding `null = True` in your model:

rowname = models.CharField(..., blank = True, null = True, unique = True) 

Change empty strings to `None` in the form:

class ModelNameForm(forms.ModelForm):
    class Meta:
        model = ModelName
    def clean_rowname(self):
        return self.cleaned_data['rowname'] or None

class ModelNameAdmin(admin.ModelAdmin):
    form = ModelNameForm

Problem

Currently in `models.py` I have ``` class ModelName(models.Model): rowname = models.CharField(max_length=100, blank = True, unique=True) ``` This does wonders as far as making sure the same value isn't submitted to the database twice but is there a way that I can have unique not raise an error when the value that is a duplicate is an empty string? Does `unique` take an exception argument?

Original source

Related problems