Sie benötigen Ihre eigenen AbstractUser
und BaseUserManager
Klassen zu schreiben. Zum Glück it's pretty simple, fügen Sie etwas zu Ihrer App Modelle:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class Account(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=40, unique=True, blank=True)
first_name = models.CharField(max_length=40, blank=True)
last_name = models.CharField(max_length=40, blank=True)
is_admin = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = AccountManager()
# This tells Django that this field is absolutely important...
USERNAME_FIELD = 'email'
# ...and username is now optional because it doesn't show up here!
REQUIRED_FIELDS = []
def __unicode__(self):
return self.email
def get_full_name(self):
return ' '.join([self.first_name, self.last_name])
def get_short_name(self):
return self.first_name
class AccountManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError('User must provide an e-mail address')
account = self.model(
email=self.normalize_email(email)
)
account.set_password(password)
account.save()
return account
def create_superuser(self, email, password=None):
account = self.create_user(email, password)
account.is_admin = True
account.save()
return account
Als nächstes sagen Django, dass dieses Modell ist Ihr neue User
Klasse des Projekts. Fügen Sie die folgende auf Ihre settings.py
Datei:
AUTH_USER_MODEL = 'apiapp.Account'
Sobald das erledigt ist, einfach migrieren:
python manage.py makemigrations
python manage.py migrate
Von diesem Punkt an neuen Nutzer werden von diesem neuen Modell dargestellt werden (man müßte Migrationen zu handhaben manuell), einschließlich überall wo Sie self.request.user
verwenden könnten!
Danke für Ihre Antwort. Was ist der Vorteil meiner AbstractUser und Manager-Klassen des Schreibens über die folgenden allauth Einstellungen ändern: 'ACCOUNT_USER_MODEL_USERNAME_FIELD = Keine ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_AUTHENTICATION_METHOD = 'E-Mail'' – RobChooses
Eigentlich ist total verwirrt bin. Mit diesen Alllauth-Einstellungen, ACCOUNT_USER_MODEL_USERNAME_FIELD = None, usw., im Django-Admin, unter Benutzer hinzufügen, heißt es, dass der Benutzername weiterhin benötigt wird. – RobChooses
Ich denke, die Verwendung eines benutzerdefinierten AbstractUsers ist am sinnvollsten, weil Sie keine Beziehungen jonglieren müssen, weil 'auth.model.User' und jedes andere' Model', das Sie geschrieben haben, um Benutzerprofilinformationen zu verfolgen. Ich kann jedoch nicht mit 'allauth' sprechen. – IAmKale