Django認證系統中提供的用戶模型類及方法很方便,我們可以使用這個模型類,但是字段有些無法滿足項目需求,如本項目中需要保存用戶的手機號,需要給模型類添加額外的字段。
Django提供了django.contrib.auth.models.AbstractUser
用戶抽象模型類允許我們繼承,擴展字段來使用Django認證系統的用戶模型類。
我們可以在apps中創建Django應用users,並在配置文件中注冊users應用。
創建用戶模塊的子應用
python ../../manage.py startapp users
在settings.py文件中注冊子應用。
INSTALLED_APPS = [
...
'users',
]
在創建好的應用models.py中定義用戶的用戶模型類
class User(AbstractUser):
"""用戶模型類"""
mobile = models.CharField(max_length=11, unique=True, verbose_name='手機號')
class Meta:
db_table = 'ly_users'
verbose_name = '用戶'
verbose_name_plural = verbose_name
我們自定義的用戶模型類還不能直接被Django的認證系統所識別,需要在配置文件中告知Django認證系統使用我們自定義的模型類。
在配置文件中進行設置 AUTH_USER_MODEL = 'users.User'
AUTH_USER_MODEL
參數的設置以點.
來分隔,表示應用名.模型類名
。
注意:Django建議我們對於AUTH_USER_MODEL參數的設置一定要在第一次數據庫遷移之前就設置好,否則后續使用可能出現未知錯誤。
執行數據庫遷移
python manage.py makemigrations
python manage.py migrate
如果在第一次數據遷移以后,才設置AUTH_USER_MODEL自定義用戶模型,則會報錯。解決方案如下:
0. 先把現有的數據庫導出備份,然后清掉數據庫中所有的數據表。
1. 把開發者創建的所有子應用下面的migrations目錄下除了__init__.py以外的所有遷移文件,只要涉及到用戶的,一律刪除
2. 把django.contrib.admin.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。
3. 把django.contrib.auth.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。
4. 把reversion.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。
5. 把xadmin.migrations目錄下除了__init__.py以外的所有遷移文件,全部刪除。
6. 接下來,執行數據遷移,回顧第0步中的數據,以后如果要修改用戶相關數據,不需要重復本次操作,直接數據遷移即可。```