」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Django AllAuth 章 使用自訂欄位擴充 Django AllAuth 使用者模型

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

發佈於2024-08-25
瀏覽:379

注意:本文最初發佈在我的 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作業系統
  • ETC。

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

關於作者

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

版本聲明 本文轉載於:https://dev.to/doctorserone/django-allauth-chapter-5-extending-django-allauth-user-model-with-custom-fields-55ia?1如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-04-11
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制,控制元素的滾動行為對於確保用戶體驗和可訪問性是必不可少的。一種這樣的方案涉及限制動態大小的父元素中元素的滾動範圍。 問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限...
    程式設計 發佈於2025-04-11
  • 如何通過單擊鼠標單擊的div中編程選擇所有文本?
    如何通過單擊鼠標單擊的div中編程選擇所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-04-11
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-04-11
  • 如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    在Visual Studio 2012 儘管已安裝了MySQL Connector v.6.5.4,但無法將MySQL數據庫添加到實體框架的“ DataSource對話框”中。為了解決這一問題,至關重要的是要了解MySQL連接器v.6.5.5及以後的6.6.x版本將提供MySQL的官方Visual...
    程式設計 發佈於2025-04-11
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-04-11
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-04-11
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-04-11
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    程式設計 發佈於2025-04-11
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-04-11
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-04-11
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-04-11
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭的數組使用curlopt_httpheader選項:響應將存儲在變量$ result。 示例代...
    程式設計 發佈於2025-04-11
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否有必要在heap-procal extrable exit exit上進行手動調用“ delete”操作員,但開發人員通常會想知道是否需要手動調用“ delete”操作員。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(...
    程式設計 發佈於2025-04-11
  • 如何配置Pytesseract以使用數字輸出的單位數字識別?
    如何配置Pytesseract以使用數字輸出的單位數字識別?
    Pytesseract OCR具有單位數字識別和僅數字約束 在pytesseract的上下文中,在配置tesseract以識別單位數字和限制單個數字和限制輸出對數字可能會提出質疑。 To address this issue, we delve into the specifics of Te...
    程式設計 發佈於2025-04-11

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3