用戶關係模型的建立
上次我們搭建了環境,這次,我們創建用戶表和超級管理員。
創建app(user)
- 我們cd到apps這個文件目錄下,在ubantu的終端中打入命令
django-admin startapp <appname>
,一定要注意,打這個命令的時候有兩個條件,**一個是在apps這個文件目錄下,另一個就是用的專用的虛擬環境,**不然都創建不了app。 - 然後在生成的user中創建一個python文件,命名是urls。
- 在settings裏面的INSTALLED_APPS裏面註冊app,就是把它的名字加上,然後,去主項目的urls裏面,導入include這個方法,再將原來我們創建好的文件url拼接上去。
注意,user app裏面的urls必須是這樣的格式:
from django.urls import path from user import views app_name = 'user' urlpatterns = [ ]
不然就會報錯。
from django.urls import path,include
urlpatterns = [
# path('admin/', admin.site.urls),
path('',include('user.urls')),
# path('user/', include('user_m.urls')),
# path('', include('verifications.urls')),
]
models文件
我們在models文件裏面創建我們要的用戶模型。
用戶模型我設計成兩個,一個是普通用戶,一個是超級用戶。
django自帶用戶模型,但是根據我們中國人的習慣,通常用手機號註冊爲主,郵箱是可有可無的,所以,我要改一下django的代碼結構,變成我們想要的。
所用到的類介紹
先導入兩個類
from django.contrib.auth.models import AbstractUser,UserManager as _UserManager
from django.db import models
UserManager
def create_superuser(self, username, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(username, email, password, **extra_fields)
在源碼中,有一個create_superuser屬性,這個是創建超級管理員,我們要將裏面傳參的email改成email=None
使它默認爲空,這樣就可以了。同時,我們要初始化父類的方法,在models裏面修改的代碼如下:
class UserManager(_UserManager):
"""
define user manager for modifing 'no need email'
when 'python manager.py createsuperuser '
"""
def create_superuser(self, username, password, email=None, **extra_fields):#用原來的類去傳遞自身定義的參數
super().create_superuser(username=username,password=password, email=email, **extra_fields)#繼承了super的方法,創建
AbstractUser
源碼:
class AbstractUser(AbstractBaseUser, PermissionsMixin):
"""
An abstract base class implementing a fully featured User model with
admin-compliant permissions.
Username and password are required. Other fields are optional.
"""
username_validator = UnicodeUsernameValidator()
username = models.CharField(
_('username'),
max_length=150,
unique=True,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[username_validator],
error_messages={
'unique': _("A user with that username already exists."),
},
)
first_name = models.CharField(_('first name'), max_length=30, blank=True)
last_name = models.CharField(_('last name'), max_length=150, blank=True)
email = models.EmailField(_('email address'), blank=True)
is_staff = models.BooleanField(
_('staff status'),
default=False,
help_text=_('Designates whether the user can log into this admin site.'),
)
is_active = models.BooleanField(
_('active'),
default=True,
help_text=_(
'Designates whether this user should be treated as active. '
'Unselect this instead of deleting accounts.'
),
)
date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
objects = UserManager()
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email'] #這個要設置成你想要默認必須輸入的參數。
我們分析一下源碼,這個源碼裏面包含了username並且它是唯一的,還有first_name,last_name,但是他們默認空白是可以的,就是那個blank=True參數。我們看最下面,有一個REQUIRED_FIELDS,這個就是我們要改的內容,我們先在代碼中添加mobile字段,再把它在我們的代碼中改成mobile,其它不動。
代碼如下:
class User(AbstractUser):
objects = UserManager()#創建一個代理管理器
REQUIRED_FIELDS = ['mobile']#這個是必須要加上去的,不然會默認指定
mobile = models.CharField(max_length=11,unique=True,verbose_name='手機號',help_text='手機號',error_messages={'unique':'此手機號已經註冊'})
email_ac = models.BooleanField(default=False,verbose_name='郵箱狀態')
class Meta:
db_table = 'tb_users'
verbose_name = '用戶'
def __str__(self):
return self.username
參數介紹
help_text
這個是幫助性文字,用來提示用戶。
error_messages
是指定的報錯信息,爲之後註冊的時候打下鋪墊。給js用的。
Meta
這是一個抽象類,用來補充該類的參數,在生成模型的時候不會被實例化成對象。、
db_table
這個是給數據庫中的模型取個別名,方便查看和管理,不然django會根據駝峯命名規則給你自動生成一個。
verbose_name
給Model去一個方便閱讀的名字,這個是方便後臺管理取得名字。
最後
當所有都做好之後,我們不能直接遷移,還需要最最最關鍵的一步,這一步沒弄好,前面的都是瞎搞,這一步就是在settings文件裏面,指定替換的用戶模型類,在settings裏面最好在最後,添加:
AUTH_USER_MODEL = 'user.User' # 指定替換的用戶模型類,這個User就是我們的類名!!!
然後在項目目錄下在cmd中執行操作:
# 先
python manage.py makemigrations
# 後
python manage.py migrate
第二種,直接在pycharm中Tools這一欄,點擊 Run manage.py Task,然後直接先輸入makemigrations,然後再輸入migrate。最後查看數據庫,會發現,多了很多的表,這些表是正常的,是django自帶的用戶系統,我們只需要查看我們的tb_users在不在裏面就行。
最後的最後,在剛剛開啓的命令端輸入,createsuperuser,創建我們第一個管理員吧。