1. 程式人生 > >Django 創建自定義User模型 CustomUser

Django 創建自定義User模型 CustomUser

username 操作 pda let 擴展 函數 一個 登錄 muse

官方文檔裏給了兩種方法

1.創建一個Model,然後用一對一外鍵指到User,這樣就相當於是擴展了User,簡單又實用。

但是這樣沒法自定義User的save和delete函數(當然你直接去改django源碼也是可以的,我之前就是這麽幹的,但是改源碼這種事情實在是不靠譜),所以我就用了另一種方法

2.直接新建一個CustomUser並‘覆蓋’原來的User類

註意到django源碼裏User類的定義裏有且只有一個swappable=‘AUTH_USER_MODEL‘。我的理解是,這個設置可以指定另一個類,讓另一個類來代替這個類。

首先在model.py裏創建一個新的類CustomUser,然後去setting裏添加如下字段:

#我的app名為blog
AUTH_USER_MODEL = blog.CustomUser

這樣一來,django把所有對User的操作都轉移到了我們自己定義的CustomUser類上。

然後在blog的model.py裏的代碼如下:

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

import os


class CustomUser(AbstractUser):
    location = models.CharField(max_length=100, blank=True, null=True)
    description 
= models.CharField(max_length=300, blank=True, null=True) avatar = models.ImageField(upload_to=avatars/, default=default/default.jpg, max_length=100) def __str__(self): return self.username def delete(self, *args, **kwargs): path = self.avatar.path if path: os.remove(path) super(CustomUser, self).delete(
*args, **kwargs)

我擴展了三個字段:地址、個人簡介和頭像。

並且能夠隨意自定義save和delete函數。

註:不要輕易覆蓋save函數,因為django對User的save的調用實在是太頻繁了,就算是登錄,也會調用一次save()(django的save和update都使用save())以修改用戶的last_login,還有添加組或者修改權限的時候。你在save函數裏的代碼會被多次調用。

這樣一來,我們創建了自己的CustomUser,並且是完全代替了原來的User類(而不是創建了兩個用於管理用戶的Model)

Django 創建自定義User模型 CustomUser