Looking for django Keywords? Try Ask4Keywords

Django Specificare un modello utente personalizzato


Esempio

Il modello User incorporato di Django non è sempre appropriato per alcuni tipi di progetti. Su alcuni siti potrebbe essere più logico utilizzare un indirizzo email al posto di un nome utente, ad esempio.

Puoi sostituire il modello User predefinito aggiungendo il modello User personalizzato all'impostazione AUTH_USER_MODEL nel file delle impostazioni del progetto:

AUTH_USER_MODEL = 'myapp.MyUser'

Tieni presente che è altamente consigliato creare il AUTH_USER_MODEL prima di creare qualsiasi migrazione o eseguire manage.py migrate per la prima volta. A causa delle limitazioni della funzione di dipendenza da synamic di Django.

Ad esempio sul tuo blog potresti volere che altri autori siano in grado di accedere con un indirizzo email invece del normale nome utente, quindi creiamo un modello User personalizzato con un indirizzo email come USERNAME_FIELD :

from django.contrib.auth.models import AbstractBaseUser

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

Con l'ereditarietà di AbstractBaseUser possiamo costruire un modello User conforme. AbstractBaseUser fornisce l'implementazione di base di un modello User .

Per consentire a Django manage.py createsuperuser comando di un utente, sapere quali altri campi sono richiesti, possiamo specificare un REQUIRED_FIELDS . Questo valore non ha alcun effetto in altre parti di Django!

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

Per essere compatibili con l'altra parte di Django dobbiamo ancora specificare il valore is_active , le funzioni get_full_name() e 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

Dovresti anche creare un UserManager personalizzato per il tuo modello User , che consente a Django di utilizzare le create_user() e 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