Nun, seit 2008 ist einige Zeit vergangen und es ist Zeit für eine neue Antwort. Seit Django 1.5 werden Sie in der Lage sein, benutzerdefinierte User-Klassen zu erstellen. Zum Zeitpunkt, an dem ich dies schreibe, ist es bereits in Master eingebunden, Sie können es also ausprobieren.
Es gibt einige Informationen darüber in 諸注意 oder, wenn Sie sich eingehender damit befassen wollen, unter diese Verpflichtung .
Alles, was Sie tun müssen, ist hinzufügen AUTH_USER_MODEL
zu den Einstellungen mit dem Pfad zur benutzerdefinierten Benutzerklasse, die entweder AbstractBaseUser
(besser anpassbare Version) oder AbstractUser
(mehr oder weniger alte Benutzerklasse, die Sie erweitern können).
Für Leute, die zu faul zum Klicken sind, hier ein Code-Beispiel (entnommen aus 諸注意 ) :
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser
)
class MyUserManager(BaseUserManager):
def create_user(self, email, date_of_birth, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=MyUserManager.normalize_email(email),
date_of_birth=date_of_birth,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, date_of_birth, password):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
u = self.create_user(username,
password=password,
date_of_birth=date_of_birth
)
u.is_admin = True
u.save(using=self._db)
return u
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
date_of_birth = models.DateField()
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = MyUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['date_of_birth']
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
def __unicode__(self):
return self.email
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_staff(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin