整個項目會存在多個應用,須要存放在一個單獨的文件包了,因此新建一個apps目錄,管理全部子應用。html
在apps包目錄下穿件users應用python
python ../../manage.py startapp users
這個時候呢,須要咱們將新建立的應用註冊到django裏,但是這裏咱們修改了應用的管理目錄,與默認的方式不一樣,若是還按照以前的方式註冊APP確定會報錯,這個時候咱們能夠先查看一下django的導包路徑,在dev文件中輸入django
print(sys.path()) # 輸出包的全部搜索路徑
['/Users/xxxx/workspace/xxxx/mall/immortal_mall', '/Users/xxxx/workspace/xxxx/mall', '/Users/xxxx/workspace/xxxx/mall/venv/lib/python38.zip', '/Users/xxxx/workspace/xxxx/mall/venv/lib/python3.8', '/Users/xxxx/workspace/xxxx/mall/venv/lib/python3.8/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Users/xxxx/workspace/xxxx/mall/venv/lib/python3.8/site-packages', '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']
第一個路徑就是咱們django項目的主目錄,瀏覽器
也就是說他會搜索主目錄下的全部包,那麼就能夠定義APP的路徑爲cookie
meiduo_mall.apps.users
這個時候運行程序,是能夠運行成功的。可是呢,這樣定義註冊APP的方式太麻煩了,若是應用多的話,每一個都要這樣寫一遍,那不得煩死。因此必須得簡化。怎麼簡化,直接往包的搜索路徑中插入apps目錄的絕對路徑,那不django能夠搜索到了麼。session
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
就這樣完事兒,而後註冊APPapp
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 'immortal_mall.apps.users', 'users' ]
準備註冊所使用的的模板,放入預先新建好的templates文件夾中
函數
定義用戶註冊視圖類:測試
class RegisterView(View): """用戶註冊視圖類""" def get(self, request): '''獲取註冊頁面''' return render(request, 'register.html')
定義用戶註冊路由ui
# 總路由 urlpatterns = [ path('admin/', admin.site.urls), path('', include(('users.urls', 'users'), namespace='users')) ]
這裏要劃重點了,include函數的第一個參數是一個元祖,第一個參數沒得說,就是指定了子應用的路由,第二個參數是app_name,這裏必須制定app_name,若是不指定這個參數,寫成include('users.urls', namespace='users')
是會報錯的。
固然還有一種指定方式就是在子應用的urls文件中中指定app_name='users'
.
在users應用目錄下新建一個urls.py文件,而後寫入路由信息
urlpatterns = [ path('register/', views.RegisterView.as_view(), name='register') # name添加命名空間 ]
啓動應用,瀏覽器請求http://127.0.0.1:8989/register/,返回註冊頁面。
項目使用的是django自帶的用戶認證系統,先來了解一下都有哪些功能。
django自帶用戶認證系統能夠處理用戶帳號、組、權限以及基於cookie的用戶會話,位於django.contrib.auth
包中。
auth包是django內置的一個APP,和admin同樣,能夠同時處理認證和受權,認證就是驗證一個用戶是否是系統的人,受權決定了一個認證的用戶能夠被容許作什麼。
Django認證系統中提供了用戶模型類User保存用戶的數據,User對象是認證系統的核心:
class User(AbstractUser): """ Users within the Django authentication system are represented by this model. Username and password are required. Other fields are optional. """ class Meta(AbstractUser.Meta): swappable = 'AUTH_USER_MODEL'
Userl類沒什麼,看看父類AbstractUser
中的東西,裏面定義用戶的一些字段,裏面包括user類一些必填的字段username、password,還有其餘一些非必填的字段,is_active,is_staff等,關於用戶認證的方法都AbstractUser
的父類AbstractBaseUser
中,
不過AbstractUser類
中持有了UserManager
的實例叫作objects
,這個類提供了建立用戶的方法,好比:
user = User.objects.create_user(username, email, password, **extra_fields)
這是用戶註冊信息表單,有一個手機號的字段,可是Django提供放入用戶模型中是沒有這個字段的,須要咱們本身定義。
class User(AbstractUser): """自定義用戶模型類""" mobile = models.CharField(max_length=11, unique=True, verbose_name="手機號") class Meta: db_table = 'tb_user' # 自定義表名 verbose_name = "用戶" # 站點顯示 verbose_name_plural = verbose_name # 複數顯示
自定義的用戶模型類須要繼承AbstractUser
類,而後指定新添加的字段。添加完後運行項目,會報一個錯:
這是django系統默認的的認證對象配置,咱們使用了自定義的對象,可是這個對象沒有被指定給系統,
因此要在本身的dev配置文件中從新指定;
AUTH_USER_MODEL = 'users.User'
而後建立遷移文件,執行遷移命令,完成表的建立。
✗ python manage.py makemigrations python manage.py migrate
歡迎你們去 個人博客 瞅瞅,裏面有更多關於測試實戰的內容哦!!