2020年11月27日 星期五

Django 自訂 USER Model 範例教學

在 Django 中預設有 User Model ,

內建有幾個基本的欄位

  • username
  • first_name
  • last_name
  • email
  • password
  • groups
  • user_permissions
  • is_staff
  • is_active
  • is_superuser
  • last_login
  • date_joined

若是這些欄位都不符合使用需求時,

就需要自訂 USER Model,

這就是今天要來教大家的

Django 自訂 USER Model 範例教學

 自訂 USER Model 有幾個方法,

最簡單的是直接以一對一關係新增相關的欄位,



直接以程式碼做為範例:


from django.contrib.auth.models import User
from django.db import models


class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='帳號名稱')
real_name = models.CharField(max_length=30, blank=True, verbose_name='真實姓名')

首先必須先到 models.py 

從 django.contrib.auth.models 匯入 User 

透過一對一關係

models.OneToOneField

將 USER Model 的欄位做個延伸,

底下再加入要新增的相關欄位即可,

在此範例中將真實姓名加入 UserProfile 中,

其他也可以加上手機號碼,公司電話等等相關欄位。

特別要注意的是,

在與 USER 欄位關聯時,必須加上

on_delete=models.CASCADE

在刪除 USER Model 的時候相對應的 UserProfile 才會跟著刪除,

避免不必要的錯誤發生。

使用上也很簡單,

def my_profile(request):
target_item = UserProfile.objects.get(user=request.user)

先取得目前登入使用者的 profile,

就能直接使用新增的欄位 real_name

target_item.real_name

若網站已經上線一段時間,

原有的 USER Model 已經有許多資料,

為了新增額外的欄位以此種方式最為適合與簡單,

既不影響原有的資料,

又能根據需求新增相關欄位。

另一個方法則是使用 AbstractBaseUser / AbstractUser 直接自訂 USER Model 欄位,

相對地使用上較為複雜,

就不再此入門的範疇探討,

有機會再介紹此種方法。

沒有留言: