The TLDR answer

null=True would tell the underlying database that this field is allowed to save  null.

blank=True is applicable in the Django forms layer, i.e. any user is allowed to keep empty this field in Django form or Admin page. blank value is stored in the database.

The Detail answer

Whenever you are trying to define a Django model field this is the most common question which would come into your mind, should I use null=True or blank=True or both. Let me explain to you in detail what exactly this means

  • null is database-related. It tells the underlying database whether the column would allow null value to be saved or not.
  • blank is Django forms related. It is used for validation of Django forms, in admin or Django. Specifically when we call form.is_valid()

For example, let us see the below example-

class Company(models.Model):
    name = models.CharField(max_length=100)
    website = models.UrlField()
    founded_on = models.DateField(blank=True)
    random_date = models.DateFeild(null=True)
    random_text = models.TextField(null=True, blank=True)

I have defined a Company model which has 2 fields where we are playing around with blank and null options. Let's see what happens with the different fields

  • founded_on Anyone can send an empty string value when using admin or any form and it would be considered as a valid value. But when we would try to save the value to the database then we would raise IntegrityError  . But when we would send the data value then it would save the value to DB without any hiccup.
  • random_date When sending an empty value from the admin or form, it would through validation error, since it considers any date as valid data and empty string to be invalid data. But it also allows the column to be null at the database layer.
  • random_text This is the option that means that the field is allowed to be saved as null at the database layer and also empty string value is allowed to be valid data as per the Django admin or forms validation logic. You don't want to do this for TextField since it would mean that the column can have two possible values when no data is supplied, empty string ('') and null