首頁  >  文章  >  後端開發  >  Django AllAuth 章 使用自訂欄位擴充 Django AllAuth 使用者模型

Django AllAuth 章 使用自訂欄位擴充 Django AllAuth 使用者模型

王林
王林原創
2024-08-13 14:32:38388瀏覽

注意:本文最初發佈在我的 Substack 上,網址為 https://andresalvareziglesias.substack.com/

這是 Django AllAuth 系列文章的最後一章。在這五章中,我們發現了一個小奇蹟,一個非常有用的 Django 元件來處理我們所有的身份驗證需求。在本章中,我們將學習如何擴展基本的 Django 使用者模型以新增自訂欄位。

章節列表

  • 第 1 章 - Django 中的 Auth 一體化解決方案
  • 第 2 章 - 如何安裝與設定 Django AllAuth
  • 第 3 章 - 使用 Django AllAuth 進行社群登入
  • 第 4 章 - 自訂 Django AllAuth UI
  • 第 5 章 - 使用自訂欄位擴充 Django AllAuth 使用者模型 ←這個!

Django AllAuth Chapter  Extending Django AllAuth user model with custom fields

Django 使用者模型

AllAuth 使用標準 Django 使用者模型,加上一些額外的表來處理社交登入和登入令牌。在 Django 5 中,使用者模型位於 django.contrib.auth 套件中,並且有一堆預定義字段,您可以在官方文件中閱讀:

  • https://docs.djangoproject.com/en/5.0/ref/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 貼文中,我也會撰寫其他相關主題(總是技術和程式主題,我保證...祈禱),例如:

  • 軟體架構
  • 程式環境
  • Linux作業系統
  • 等等

如果您發現了一些有趣的技術、程式語言或其他什麼,請告訴我!我總是樂於學習新事物!

關於作者

我是 Andrés,一位來自帕爾馬的全端軟體開發人員,我正在踏上提高編碼技能的個人旅程。我也是一位自行出版的奇幻作家,以我的名字出版了四本小說。有什麼問題都可以問我!

以上是Django AllAuth 章 使用自訂欄位擴充 Django AllAuth 使用者模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn