注意:本文最初發佈在我的 Substack 上,網址為 https://andresalvareziglesias.substack.com/
這是 Django AllAuth 系列文章的最後一章。在這五章中,我們發現了一個小奇蹟,一個非常有用的 Django 元件來處理我們所有的身份驗證需求。在本章中,我們將學習如何擴展基本的 Django 使用者模型以新增自訂欄位。
AllAuth 使用標準 Django 使用者模型,加上一些額外的表來處理社交登入和登入令牌。在 Django 5 中,使用者模型位於 django.contrib.auth 套件中,並且有一堆預定義字段,您可以在官方文件中閱讀:
有時,這對我們的專案來說還不夠。 Django 可讓您建立自訂使用者表和使用者管理器,來處理每個專案的需求。
我們將建立一個自訂使用者表和一個自訂 UserManager 來處理我們的登入和註冊過程。
在我們的範例專案中開啟 models.py 並編寫以下程式碼:
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'
我們可以定義一個從 Django 的 AbstractBaseUser 模型擴展的新 User 模型。在這個新模型中,我們可以新增我們需要的所有欄位或自訂屬性。
這些行很重要:
objects = MyCustomUserManager() USERNAME_FIELD = 'email' EMAIL_FIELD = 'email'
透過這些行,我們將使用者模型與自訂 UserManager 連結起來,並且我們還定義了充當唯一「使用者名稱」的欄位。
請記得在 admin.py 中註冊新模型,以便透過 Django 管理工具對其進行管理。
from django.contrib import admin from .models import MyCustomUser admin.site.register(MyCustomUser)
在我們的範例專案中再次開啟 models.py(或根據需要為自訂 UserManager 產生另一個檔案)並編寫如下程式碼:
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
在此範例中,我們將擴充 BaseUserManager 來建立自訂 UserManager。它創建我們的新用戶,並按照我們的預期填充自訂欄位。
我們在自訂使用者模型的 UserManager 之前定義,因此 Django 知道在新使用者建立期間要使用什麼類別。
在專案的設定檔中,我們可以使用以下指令設定專案的目前使用者模型:
# 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
只需這個小更改(以及像往常一樣所需的資料庫遷移),我們就可以開始使用 AllAuth 註冊視圖建立用戶,以查看我們閃亮的自訂 UserManager 及其正在運行的模型。快速又簡單。
我們也停用 AllAuth 使用者名稱相關管理,因為我們在此範例中使用電子郵件作為使用者名稱。
我們已經到了 AllAuth 系列的最後一章。 AllAuth 是一個很棒的庫,可以處理我們應用程式中的身份驗證,並且由於其大量的預定義集成,使得使用社交登入變得特別容易。
這是本系列的最後一章,但我將在以後的文章中重新討論 AllAuth。感謝您的閱讀並祝您編碼愉快!
在 Python 和 Docker 貼文中,我也會撰寫其他相關主題(總是技術和程式主題,我保證...祈禱),例如:
如果您發現了一些有趣的技術、程式語言或其他什麼,請告訴我!我總是樂於學習新事物!
我是 Andrés,一位來自帕爾馬的全端軟體開發人員,我正在踏上提高編碼技能的個人旅程。我也是一位自行出版的奇幻作家,以我的名字出版了四本小說。有什麼問題都可以問我!
以上是Django AllAuth 章 使用自訂欄位擴充 Django AllAuth 使用者模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!