Liang2's Blog

About | Talks | Archives

Customize Django User Model

Django 帳號的欄位定義在 django.contrib.authUser 中,對使用者而言包含了:username*、first_name、last_name、email、password*。同時對開發者來說,還有:

  • 指定 Group 和 Permission
  • 是否為 staff、superuser
  • 帳號開通、最後一次登入時間

內建的帳號功能應該很實用,安全性也很好。所以一般來說都不會去改它。

如果只是想要幫 User 加個 profile,例如生日、來自哪個星球等欄位,也不需要改寫 User。參考官網 Extending the existing User model,只需要建一個 one-to-one relationship 指到 User 就好了:

from django.conf import settings

class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    birth = models.DateField()
    orig_planet = models.CharField(max_length=255)

但 Django 預設用 username 來登入,如果要改用 email 登入要怎麼做?

改用 Email 做帳號登入

因為 User 是個很重要的 model,所以改寫時要注意相容性的問題。其實官網也有教學 Specifying a custom User model,不過這教學比前面長很多。

網路上已經有人 @jcugat 做了一個套件 django-custom-user,他實作了 EmailUser 即用 email 作為帳號登入。已經把所有苦工都做好了,所以如果想要再加上自己的欄位等等,可以繼承他的 AbstractEmailUser

其實如果看完自定 User 之後,寫好 User Model 不難,比較複雜的是像創建、修改 User 以及 admin 的設定。除了讀這個套件的 source code 之後,這串 Stack Overflow 討論也提到了不同的實作方式。Django 這部份的 source code 蠻好讀的,也可以看一下。

因為之後要做 Email 認証,應該會用 django-allauth 做。感覺很久沒發文了,應該要把文章拆短才對 XD