from django.contrib.auth.models import AbstractUser, UserManager as DjangoUserManager from django.core import validators from django.db import models from django.utils.deconstruct import deconstructible from django.utils.translation import gettext_lazy as _ @deconstructible class UnicodeUsernameValidator(validators.RegexValidator): regex = r'^[\w.-]+\Z' message = _( 'Enter a valid username. This value may contain only letters, ' 'numbers, and ./-/_ characters.' ) flags = 0 class UserManager(DjangoUserManager): def get_by_natural_key(self, username): return self.get(**{self.model.USERNAME_FIELD + '__iexact': username}) class User(AbstractUser): username_validator = UnicodeUsernameValidator() objects = UserManager() username = models.CharField( _('username'), max_length=150, unique=True, help_text=_('Required. 150 characters or fewer. Letters, digits and ./-/_ only.'), validators=[username_validator], error_messages={ 'unique': _("A user with that username already exists."), }, ) @classmethod def normalize_username(cls, username): return super().normalize_username(username).lower()