Looking for django Keywords? Try Ask4Keywords

Django Określanie niestandardowego modelu użytkownika


Przykład

Wbudowany model Django User nie zawsze jest odpowiedni dla niektórych rodzajów projektów. W niektórych witrynach bardziej sensowne może być na przykład użycie adresu e-mail zamiast nazwy użytkownika.

Możesz zastąpić domyślny model User dodając dostosowany model User do ustawienia AUTH_USER_MODEL w pliku ustawień projektów:

AUTH_USER_MODEL = 'myapp.MyUser'

Należy pamiętać , że zaleca się utworzenie AUTH_USER_MODEL przed utworzeniem jakichkolwiek migracji lub uruchomieniem manage.py migrate po raz pierwszy. Z powodu ograniczeń synamicznej funkcji zależności Django.

Na przykład na swoim blogu możesz chcieć, aby inni autorzy mogli logować się przy użyciu adresu e-mail zamiast zwykłej nazwy użytkownika, dlatego tworzymy niestandardowy model User z adresem e-mail jako USERNAME_FIELD :

from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):
     email = models.EmailField(unique=True)
     
     USERNAME_FIELD = 'email'

Dziedzicząc AbstractBaseUser , możemy zbudować zgodny model User . AbstractBaseUser zapewnia podstawową implementację modelu User .

Aby Django manage.py createsuperuser wiedziała, które inne pola są wymagane, możemy określić pole REQUIRED_FIELDS . Ta wartość nie ma wpływu na inne części Django!

class CustomUser(AbstractBaseUser):
    ...
    first_name = models.CharField(max_length=254)
    last_name = models.CharField(max_length=254)
    ...
    REQUIRED_FIELDS = ['first_name', 'last_name']

Aby zachować zgodność z inną częścią Django, nadal musimy określić wartość is_active , funkcje get_full_name() i get_short_name() :

class CustomUser(AbstractBaseUser):
    ...
    is_active = models.BooleanField(default=False)
    ...
    def get_full_name(self):
        full_name = "{0} {1}".format(self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        return self.first_name

Powinieneś także utworzyć niestandardowego UserManager User dla swojego modelu User , który pozwoli Django na użycie funkcji create_user() i create_superuser() :

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, first_name, last_name, password=None):
        if not email:
            raise ValueError('Users must have an email address')

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

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

    def create_superuser(self, email, first_name, last_name, password):
        user = self.create_user(
            email=email,
            first_name=first_name,
            last_name=last_name,
            password=password,
        )

        user.is_admin = True
        user.is_active = True
        user.save(using=self.db)
        return user