Django 建立自定義User模型 CustomUser

官方文檔裏給了兩種方法django

1.建立一個Model,而後用一對一外鍵指到User,這樣就至關因而擴展了User,簡單又實用。app

可是這樣無法自定義User的save和delete函數(固然你直接去改django源碼也是能夠的,我以前就是這麼幹的,可是改源碼這種事情實在是不靠譜),因此我就用了另外一種方法函數

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

注意到django源碼裏User類的定義裏有且只有一個swappable='AUTH_USER_MODEL'。個人理解是,這個設置能夠指定另外一個類,讓另外一個類來代替這個類。code

首先在model.py裏建立一個新的類CustomUser,而後去setting裏添加以下字段:blog

#個人app名爲blog
AUTH_USER_MODEL = 'blog.CustomUser'

這樣一來,django把全部對User的操做都轉移到了咱們本身定義的CustomUser類上。ip

而後在blog的model.py裏的代碼以下:rem

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)

相關文章
相關標籤/搜索