Tạo mô hình người dùng tùy chỉnh trong Django

Tram Ho

Làm thế nào để thay thế username với email trong Django authentication?

Bài viết này sẽ giải thích step-by-step cách tạo một custom User model trong Django mà khi đó email được sử dụng như primary user thay vì username cho việc authentication.

Cần chú ý rằng các làm này sẽ làm thay đổi rất nhiều đến schema của database vậy nên khuyến khích khi thực hiện một dự án mới. Với một dự án đã được phát triển trước đó thì cần thiết phải backup data và tạo lại DB.

Objectives

Sau bài viết này bạn có thể nắm được :

  1. Giải thích sứ khác nhau giữa AbstractUser và AbstractBaseUser
  2. Giải thích tại sao lại cần setup một custom User model khi bắt đầu một dự án Django mới.
  3. Bắt đầu một dự án Django với custom User model
  4. Sử dụng một email address như primary user thay vì username để xác thực.
  5. Luyện tập với test-first development khi implementing một custom User model.

AbstractUser với AbstractBaseUser

Mặc định User model trong Django sử dụng username để xác thực thay đó bạn mong muốn sử dụng email, bạn sẽ cần tạo một custom User model bằng việc sử dụng một trong hai subclassing AbstractUser hoặc AbstractBaseUser .

Options

  1. AbstractUser : Sử dụng option này nếu như bạn muốn sử dụng các trường sẵn có của User và chỉ muốn remove trường username.
  2. AbstractBaseUser: Sử dụng option này nếu như bạn muốn tạo mới hoàn toàn một User model mới.

Chúng ta sẽ thử cả với hai option này. Step giống nhau cho cả 2 option :

  1. Tạo một custom User model và Manager
  2. Update setting.py
  3. Customize UserCreationForm và UserChangeForm
  4. Update admin

Cần phải nhấn mạnh là custom User model được sử dụng khi bắt đầu một dự án Django mới. Nếu không phải với dự án mới chúng ta cần phải tạo một model khác như UserProfile chẳng hạn và link nó với User model của Django với OneToOneField nếu như bạn muốn thêm field mới vào User model.

Project Setup

Tiến hành tạo mới một project với một users app.

Chưa tiến hành migrations. Hãy nhớ bằng bạn cần tạo custom User model trước khi bạn apply cho migration đầu tiên.

Thêm app vào list INSTALLED_APPS trong setting.py:

Test

Chúng ta sẽ take a test trước bằng cách thêm đoạn code sau trong users/tests.py và chắc chắn rằng tests fail.

Model Manager

Chúng ta cần custom Manager bởi subclassing BaseUserManager, sử dụng một email như unique identifier thay username.

User Model

Lựa chọn một trong hai option sửa dụng subclassing AbstractUser hoặc AbstractBaseUser.

AbstractUser

Ở đoạn code trên :

  1. Tạo một class có tên là CustomUser subclasses AbstractUser
  2. Remove username field
  3. Make email là trường require và unique
  4. Set giá trị USERNAME_FIELD — định nghĩa unique identifier cho User model là email.
  5. Chỉ thị tất cả các objects được quản lý bởi CustomUserManager.

AbstractBaseUser
Update users/models.py

Ở đoạn code trên :

  1. Tạo một class có tên là CustomUser subclasses AbstractBaseUser
  2. Thêm các fields email, is_staff, is_active, date_joined.
  3. Set giá trị USERNAME_FIELD — định nghĩa unique identifier cho User model là email.
  4. Chỉ thị tất cả các objects được quản lý bởi CustomUserManager.

Settings

Thêm vào settings.py line dưới đây để Django biết rằng sẽ sử dụng class User mới.

AUTH_USER_MODEL = 'users.CustomUser'

Tiếp theo hãy thử apply migrations để tiến hành tạo database mới sử dụng custom User model. Trước khi thực hiện việc này chúng ta sẽ sử dụng –dry-run flag để xác định được sau khi migrations kết quả sẽ như thế nào, với flag này file migration vẫn chưa được tạo ra.

python manage.py makemigrations --dry-run --verbosity 3

Case customUser subclasses AbstractUser

Case customUser subclasses AbstractBaseUser

Xác nhận chắc chắn rằng migtations không chứa username. Tiếp theo tạo và apply migration.

View schema:

Chạy lại tests

Forms

Subclass UserCreationForm và UserChangeForm vói CustomUser mới. Tạo mới file trong users với tên forms.py

Admin

Run server, login vào admin site. Bạn có thể add user với email như thông thường.

Conclusion

Ở bài viết này chúng ta đã biết được cách custom User model mà ở đó email được sủ dụng như primary user identifier thay vì username cho authentication. Ngoài ra cũng còn một cách nữa được suggest nên sử dụng đó là tạo một model quan hệ 1-1 với User model của Django như Profile model chẳn hạn và sẽ add các field mới ở Profile.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo