初學者指南:深入了解 Django 的 create_user 方法
更新日期: 2025 年 1 月 29 日
本文為 Django 登入註冊功能(後端)系列文,第 1 篇
- 新手指南|使用 Django 實現後端會員登入、註冊功能
- Django Rest Framework (DRF) 新手指南:為什麼選擇 DRF 建構 API?
- Django Rest Framework (DRF) 新手指南:用 ViewSets 快速構建 CRUD API
- 初學者指南:理解 Token 認證及其運作方式
- Django REST Framework (DRF) 認證方式、預設權限規則|新手指南
- Django Rest Framework 入門指南:如何正確處理 HTTP 狀態碼
- 初學者指南:深入了解 Django 的 create_user 方法 👈所在位置
- 新手指南:深入了解 Django 的 authenticate 方法
- Django REST Framework|@permission_classes指導手冊
- 使用 Postman 測試 Django 後端的註冊、登入與登出功能
在 Django 的開發過程中,使用者的管理是一個不可或缺的環節。
Django 提供了一個強大且易用的認證框架,而其中的 create_user
方法則是用來簡化和標準化使用者創建的核心工具。
無論您是剛開始學習 Django 還是對認證系統不太熟悉,本篇文章將從零開始,帶您全面了解 create_user
的功能、用法以及最佳實踐。
什麼是 create_user
?
create_user
是 Django User 模型管理器 (UserManager
) 中的一個方法,專門用來創建普通使用者(非超級管理員)。
它可以幫助開發者簡化處理使用者創建時的繁瑣細節,例如密碼加密和資料驗證。
常見的用法如下:
from django.contrib.auth.models import User
# 創建新使用者
user = User.objects.create_user(username='myusername', email='[email protected]', password='mypassword')
為什麼選擇 create_user
?它有哪些功能?
create_user
的強大之處在於它自動化處理了許多細節,這不僅提升了開發效率,也能降低錯誤發生的機率。
密碼加密
為什麼需要加密密碼?
密碼以明文形式存儲會造成安全漏洞,一旦資料庫洩漏,所有使用者的帳戶都可能受到威脅。
Django 的 create_user
方法內建加鹽哈希(不可逆加密),確保密碼安全。
密碼加密範例
user = User.objects.create_user(username='testuser', password='12345')
# 密碼存儲在資料庫中時,會變成加密形式
print(user.password)
# 類似輸出:pbkdf2_sha256$320000$...(加密密碼)
資料驗證
create_user
方法確保使用者提供的資料有效,主要包括:
- 檢查必填欄位是否提供(如
username
和password
)。 - 檢查唯一性(例如,確保
username
不重複)。
資料驗證範例
如果試圖創建重複的使用者名稱,會拋出錯誤:
try:
user1 = User.objects.create_user(username='testuser', password='12345')
user2 = User.objects.create_user(username='testuser', password='54321')
except Exception as e:
print(e)
# 輸出:UNIQUE constraint failed: auth_user.username
簡化邏輯
如果手動創建使用者,您需要自己處理密碼加密和資料驗證,這不僅繁瑣且容易出錯。
create_user
則簡化了整個過程:
# 手動加密的方式
from django.contrib.auth.hashers import make_password
user = User(username='manualuser', password=make_password('mypassword'))
user.save()
# 使用 create_user,自動加密與驗證
user = User.objects.create_user(username='autouser', password='mypassword')
create_user
方法的參數解析
以下是 create_user
的常見參數及其用途:
參數名稱 | 是否必填 | 說明 |
---|---|---|
username | ✅ | 使用者名稱,必須唯一,為識別使用者的主要欄位。 |
❌ | 使用者的電子郵件地址,非必填,但建議提供以用於密碼重設或通知功能。 | |
password | ❌ | 使用者的密碼,如果未提供,則會創建一個無法登入的使用者(需後續設定密碼)。 |
其他欄位 | ❌ | 若擴展了 User 模型,可以在這裡傳遞額外的自訂欄位(例如 phone_number)。 |
範例:
user = User.objects.create_user(
username='newuser',
email='[email protected]',
password='securepassword123'
)
create_user
與 create_superuser
的區別
Django 提供了兩種方法來創建使用者:create_user
和 create_superuser
。
方法 | 用途 | 預設權限 |
---|---|---|
create_user | 創建普通使用者 | is_staff=False,is_superuser=False |
create_superuser | 創建超級管理員 | is_staff=True,is_superuser=True |
範例對比:
# 創建普通使用者
user = User.objects.create_user(username='regularuser', password='password123')
print(user.is_staff) # False
print(user.is_superuser) # False
# 創建超級管理員
admin = User.objects.create_superuser(username='adminuser', password='admin123')
print(admin.is_staff) # True
print(admin.is_superuser) # True
如何自訂 create_user
的行為?
有時,預設的 create_user
方法可能無法滿足所有需求(例如,您需要新增欄位)。
在這種情況下,可以通過自訂 User
模型和管理器來擴展功能。
自訂 User 模型
您可以擴展內建的 User
模型,為其添加額外欄位:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True)
自訂 UserManager
在擴展模型後,您需要自訂管理器來覆蓋 create_user
方法:
from django.contrib.auth.models import BaseUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, username, email, password=None, **extra_fields):
if not email:
raise ValueError('電子郵件是必填欄位')
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
總結
create_user
的核心價值- 簡化使用者創建過程,提供更安全的密碼處理方式。
- 自動進行資料驗證,降低錯誤風險。
- 什麼時候應該使用
create_user
?- 每當需要新增普通使用者到資料庫時,都應使用此方法。
- 擴展功能的可能性
- 如果需要更多自訂欄位或特殊邏輯,可以通過擴展
User
模型和UserManager
來實現。
- 如果需要更多自訂欄位或特殊邏輯,可以通過擴展
學會了 create_user
,您就掌握了 Django 認證系統的一項重要基石!