0

Was ist die beste (einfachste?) Möglichkeit, eine E-Mail nur für die Benutzerregistrierung zu machen und keinen Benutzernamen im django-rest-auth-Framework zu machen ?Best Practice für E-Mail in django-rest-auth erforderlich

Müsste ich zum Beispiel einen neuen Benutzer-Serializer schreiben? Gibt es eine Flag-Einstellung, die ich True oder False setzen kann, um diese Anforderung stattdessen zu deaktivieren oder zu aktivieren?

Dank

Antwort

0

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!

+0

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

+0

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

+0

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