建立使用者APP
整個專案會存在多個應用,需要存放在一個單獨的檔案包了,這方方便管理,所以新建一個apps目錄,管理所有子應用。
在apps包目錄下穿件users應用
python ../../manage.py startapp users這個時候呢,需要我們將新建立的應用註冊到django裡,可是這裡我們修改了應用的管理目錄,與預設的方式不同,如果還按照之前的方式註冊APP肯定會報錯,這個時候我們可以先檢視一下django的導包路徑,在dev檔案中輸入
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的路徑為
meiduo_mall.apps.users這個時候執行程式,是可以執行成功的。但是呢,這樣定義註冊APP的方式太麻煩了,如果應用多的話,每個都要這樣寫一遍,那不得煩死。所以必須得簡化。怎麼簡化,直接往包的搜尋路徑中插入apps目錄的絕對路徑,那不django可以搜尋到了麼。
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))就這樣完事兒,然後註冊APP
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')
定義使用者註冊路由
# 總路由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預設使用者認證系統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/conf/global_settings.py包中是django預設的全域性設定,這裡有django系統預設的的認證物件配置,在我們使用了自定義的物件,但是這個物件沒有被指定給系統,所以會報上面的錯誤
所以要在自己的dev配置檔案中重新指定;
AUTH_USER_MODEL = 'users.User'然後建立遷移檔案,執行遷移命令,完成表的建立。
✗ python manage.py makemigrations python manage.py migrate如果沒有報錯會輸出建表的記錄,進入資料庫檢視,會看到所有建好的表。