首頁>技術>

建立使用者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

如果沒有報錯會輸出建表的記錄,進入資料庫檢視,會看到所有建好的表。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 軟體特攻隊|為什麼 Qt 成為 c++ 介面程式設計的第一選擇?