Looking for django Keywords? Try Ask4Keywords

Django Een aangepast gebruikersmodel specificeren


Voorbeeld

Het ingebouwde User Django is niet altijd geschikt voor sommige soorten projecten. Op sommige sites kan het logischer zijn om bijvoorbeeld een e-mailadres te gebruiken in plaats van een gebruikersnaam.

U kunt het standaard User overschrijven door uw aangepaste User toe te voegen aan de instelling AUTH_USER_MODEL in uw bestand met projectinstellingen:

AUTH_USER_MODEL = 'myapp.MyUser'

Houd er rekening mee dat het zeer raadzaam is om AUTH_USER_MODEL te maken voordat u migraties maakt of voor het eerst migraties met manage.py migrate . Vanwege beperkingen van de synamic afhankelijkheidsfunctie van Django.

Op uw blog wilt u bijvoorbeeld dat andere auteurs zich kunnen aanmelden met een e-mailadres in plaats van de gewone gebruikersnaam. Daarom maken we een aangepast User met een e-mailadres als USERNAME_FIELD :

from django.contrib.auth.models import AbstractBaseUser

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

Door de AbstractBaseUser erven, kunnen we een compatibel User . AbstractBaseUser biedt de kernimplementatie van een User .

Om de opdracht Django manage.py createsuperuser te laten weten welke andere velden vereist zijn, kunnen we een REQUIRED_FIELDS specificeren. Deze waarde heeft geen effect in andere delen van Django!

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

Om te voldoen aan andere delen van Django moeten we nog steeds de waarde is_active opgeven, de functies get_full_name() en 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

U moet ook een aangepaste UserManager voor uw User maken, waarmee Django de create_user() en create_superuser() kan gebruiken:

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