Looking for django Keywords? Try Ask4Keywords

Django Ange en anpassad användarmodell


Exempel

Django inbyggda User modellen inte alltid appropiate för vissa typer av projekt. På vissa webbplatser kan det vara mer klokt att använda en e-postadress istället för ett användarnamn till exempel.

Du kan åsidosätta User modell lägga din anpassade User modellen till AUTH_USER_MODEL inställningen i dina projekt inställningsfil:

AUTH_USER_MODEL = 'myapp.MyUser'

Observera att det är mycket tillrådligt att skapa AUTH_USER_MODEL innan du skapar några migrationer eller kör manage.py migrate för första gången. På grund av begränsningarna i Djangos synamiska beroende-funktion.

Till exempel på din blogg kanske du vill andra författare för att kunna logga in med en e-postadress i stället för den vanliga användarnamn, så vi skapa en anpassad User modell med en e-postadress som USERNAME_FIELD :

from django.contrib.auth.models import AbstractBaseUser

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

Genom inherinting den AbstractBaseUser kan vi konstruera en kompatibel User modell. AbstractBaseUser ger kärn genomförandet av en User

För att låta Django manage.py createsuperuser kommandot veta vilka andra fält som krävs kan vi ange ett REQUIRED_FIELDS . Detta värde har ingen effekt i andra delar av Django!

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

För att följa andra delar av Django måste vi fortfarande ange värdet is_active , funktionerna get_full_name() och 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

Du bör också skapa en anpassad UserManager för User modell, vilket gör Django att använda create_user() och create_superuser() funktioner:

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