HINWEIS: Dieser Artikel wurde ursprünglich auf meinem Substack unter https://andresalvareziglesias.substack.com/ veröffentlicht
Dies ist das letzte Kapitel dieser Django AllAuth-Beitragsreihe. In diesen fünf Kapiteln haben wir ein kleines Wunder entdeckt, eine wirklich hilfreiche Django-Komponente, die alle unsere Authentifizierungsanforderungen erfüllt. In diesem Kapitel erfahren Sie, wie Sie das grundlegende Django-Benutzermodell erweitern, um benutzerdefinierte Felder hinzuzufügen.
AllAuth verwendet das Standard-Django-Benutzermodell sowie einige zusätzliche Tabellen zur Verwaltung von Social Login und Login-Tokens. In Django 5 befindet sich das Benutzermodell im Paket django.contrib.auth und verfügt über eine Reihe vordefinierter Felder, wie Sie im offiziellen Dokument lesen können:
Manchmal reicht das für unser Projekt nicht aus. Mit Django können Sie benutzerdefinierte Benutzertabellen und Benutzermanager erstellen, um den Anforderungen jedes Projekts gerecht zu werden.
Wir werden eine benutzerdefinierte Benutzertabelle und einen benutzerdefinierten UserManager erstellen, um unsere Anmelde- und Registrierungsprozesse zu verwalten.
Öffnen Sie models.py in unserem Beispielprojekt und schreiben Sie einen Code wie diesen:
class MyCustomUser(AbstractBaseUser): email = models.EmailField(unique=True) first_name = models.CharField(max_length=30, blank=True) last_name = models.CharField(max_length=30, blank=True) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) timezone = models.CharField(max_length=30, default='UTC') is_custom = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects = MyCustomUserManager() USERNAME_FIELD = 'email' EMAIL_FIELD = 'email' def __str__(self): return self.email def has_perm(self, perm, obj=None): return True def has_module_perms(self, app_label): return True @property def is_utc(self): return self.timezone == 'UTC'
Wir können ein neues Benutzermodell definieren, das das AbstractBaseUser-Modell von Django erweitert. In diesem neuen Modell können wir alle Felder oder benutzerdefinierten Eigenschaften hinzufügen, die wir benötigen.
Diese Zeilen sind wichtig:
objects = MyCustomUserManager() USERNAME_FIELD = 'email' EMAIL_FIELD = 'email'
Mit diesen Zeilen verknüpfen wir das Benutzermodell mit unserem benutzerdefinierten UserManager und definieren außerdem das Feld, das als eindeutiger „Benutzername“ fungiert.
Denken Sie daran, das neue Modell in admin.py zu registrieren, um es über das Django-Administrationstool zu verwalten.
from django.contrib import admin from .models import MyCustomUser admin.site.register(MyCustomUser)
Öffnen Sie models.py erneut in unserem Beispielprojekt (oder generieren Sie eine andere Datei für den benutzerdefinierten UserManager, wenn Sie möchten) und schreiben Sie einen Code wie diesen:
class MyCustomUserManager(BaseUserManager): def create_user(self, email, 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.save(using=self._db) return user def create_superuser(self, email, password): user = self.create_user( email=email, password=password, ) user.is_admin = True user.is_staff = True user.save(using=self._db) return user
In diesem Beispiel erweitern wir BaseUserManager, um unseren benutzerdefinierten UserManager zu erstellen. Es erstellt unsere neuen Benutzer und füllt die benutzerdefinierten Felder wie erwartet aus.
Wir haben vorab den UserManager für unser benutzerdefiniertes Benutzermodell definiert, damit Django weiß, welche Klasse bei der Erstellung neuer Benutzer verwendet werden soll.
In der Einstellungsdatei unseres Projekts können wir das aktuelle Benutzermodell für unser Projekt festlegen mit:
# Set custom user model as the active one AUTH_USER_MODEL = 'demo.MyCustomUser' # Configure AllAuth username related management, because we are # using the e-mail as username. See: # https://docs.allauth.org/en/latest/account/advanced.html ACCOUNT_AUTHENTICATION_METHOD = 'email' ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_UNIQUE_EMAIL = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_USER_MODEL_USERNAME_FIELD = None
Mit nur dieser kleinen Änderung (und wie üblich der erforderlichen DB-Migration) können wir damit beginnen, Benutzer mit AllAuth-Anmeldeansichten zu erstellen, um unseren glänzenden benutzerdefinierten UserManager und sein Modell in Aktion zu sehen. Schnell und einfach.
Wir deaktivieren auch die AllAuth-Benutzernamenverwaltung, da wir in diesem Beispiel die E-Mail-Adresse als Benutzernamen verwenden.
Wir haben das letzte Kapitel dieser AllAuth-Reihe erreicht. AllAuth ist eine wunderbare Bibliothek für die Authentifizierung in unseren Apps und erleichtert dank der großen Liste vordefinierter Integrationen die Arbeit mit Social-Logins besonders.
Dies ist das letzte Kapitel der Serie, aber ich werde AllAuth in zukünftigen Beiträgen noch einmal aufgreifen. Vielen Dank fürs Lesen und viel Spaß beim Codieren!
Neben den Python- und Docker-Beiträgen werde ich auch über andere verwandte Themen schreiben (immer Technik- und Programmierthemen, das verspreche ich ... mit gedrückten Daumen), wie zum Beispiel:
Wenn Sie eine interessante Technologie, Programmiersprache oder was auch immer gefunden haben, lassen Sie es mich bitte wissen! Ich bin immer offen dafür, etwas Neues zu lernen!
Ich bin Andrés, ein Full-Stack-Softwareentwickler mit Sitz in Palma, auf einer persönlichen Reise, um meine Programmierfähigkeiten zu verbessern. Ich bin auch ein selbstveröffentlichter Fantasy-Autor mit vier veröffentlichten Romanen. Fühlen Sie sich frei, mich alles zu fragen!
Das obige ist der detaillierte Inhalt vonDjango AllAuth-Kapitel Erweiterung des Django AllAuth-Benutzermodells mit benutzerdefinierten Feldern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!