Django ValidationError date format exception

2019-08-12 17:01发布

Hi I check all question about my answer and doesn't find solution. Today I change my CustomUser model and then it stop works. I think, I failed one thing, when django ask me about default value to datefield and I add "" (empty string), but I not sure.
I tried to delete all db tables and migrate again, tried delete all migrations and still don't work
My model:

  class UserManager(BaseUserManager):

    def create_user(self, username, email, password=None):
        if not email:
            raise ValueError('You must set email ')
        if not username:
            raise ValueError('User must have username')

        user = self.model( username=username, 
        email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, password):
        user = self.create_user(username=username, email=email, password=password)
        user.is_admin = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

 class CustomUser(AbstractBaseUser, PermissionsMixin):

    alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', message='Only alphanumeric characters are allowed.')

    username = models.CharField(unique=True, max_length=30, validators= [alphanumeric])

    email = models.EmailField(
        'Email',
        max_length=255,
        unique=True,
        db_index=True
        )
    avatar = models.ImageField(
        'Avatar',
        blank=True,
        upload_to='user/avatar',
        default='user/default.jpg'
        )
    firstname = models.CharField(
        'First name',
        max_length=40,
        blank=True,
        )
    lastname = models.CharField(
        'Last name',
        max_length=40,
        blank=True,
        )
    date_of_birth = models.DateField(
        'Date of birth',
        null=True,
        blank=True,
        )
    register_date = models.DateField(
        'Register date',
        auto_now_add=True,
        null=True,
        blank=True,
        )
    is_active = models.BooleanField(
        'Active',
        default=True
        )
    is_admin = models.BooleanField(
        'Superuser',
        default=False
        )

    def age(self):
        x = date.today()
        if self.date_of_birth.year is None:
            return ''
        else:
            return x.year - self.date_of_birth.year     

    @property
    def is_staff(self):
        return self.is_admin

    def get_short_name(self):
        return self.email

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

my server log:
Running migrations:

 Rendering model states... DONE
  Applying admin.0001_initial... OK
  Applying sessions.0001_initial... OK
  Applying users.0008_auto_20151104_1042...Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/core/management/base.py", line 393, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/core/management/base.py", line 444, in execute
    output = self.handle(*args, **options)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 222, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/migrations/executor.py", line 110, in migrate
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/migrations/executor.py", line 148, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/migrations/migration.py", line 115, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 484, in alter_field
    old_db_params, new_db_params, strict)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 567, in _alter_field
    new_default = self.effective_default(new_field)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 211, in effective_default
    default = field.get_db_prep_save(default, self.connection)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 710, in get_db_prep_save
    prepared=False)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 1322, in get_db_prep_value
    value = self.get_prep_value(value)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 1317, in get_prep_value
    return self.to_python(value)
  File "/home/ivan/diabetes_django/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 1287, in to_python
    params={'value': value},
django.core.exceptions.ValidationError: ["'' value has an invalid date format. It must be in YYYY-MM-DD format."]

1条回答
Evening l夕情丶
2楼-- · 2019-08-12 17:46
django.core.exceptions.ValidationError: ["'' value has an invalid date format. It must be in YYYY-MM-DD format."]

As the error message says, the empty string is an invalid value for a date. You could either provide a string in the required format, e.g. "2015-11-04", or use python's date, e.g. date.today().

However, I'm slightly worried that you have this change in migration 0008 in your migrations. Changing to a custom user in an existing project is extremely tricky (see the warning in the docs). If you delete all your user migrations and recreate them, then it should create the model from scratch, and not ask for a default date at all.

查看更多
登录 后发表回答