Django&Vue實戰(zhàn)
一、虛擬環(huán)境
1.1 安裝虛擬環(huán)境
# 創(chuàng)建虛擬環(huán)境文件夾
d:\>mkdir virtualenv
d:\>cd virtualenv
d:\virtualenv>pip install virtualenv
# 虛擬環(huán)境-p指向python解釋器,創(chuàng)建文件夾env-py3.6
d:\virtualenv>virtualenv -p D:\學(xué)習(xí)\編程\Python\python\python.exe env-py3.6
- 激活虛擬環(huán)境
# 進(jìn)入Scripts目錄激活虛擬環(huán)境
d:\virtualenv>cd env-py3.6\Scripts
d:\virtualenv\env-py3.6\Scripts>activate
- 退出虛擬環(huán)境
(env-py3.6) d:\virtualenv\env-py3.6\Scripts>deactivate.bat
1.2 安裝Django
# 虛擬環(huán)境下安裝Django
(env-py3.6) d:\virtualenv\env-py3.6\Scripts>pip install django
# 創(chuàng)建Django項目
(env-py3.6) d:\virtualenv\env-py3.6\Scripts>django-admin startproject myshop
二、路由
2.1 路由基本配置
from django.contrib import admin
from django.urls import path
from . imporot views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index, name='index'),
# path(路由, 視圖函數(shù), 別名)
]
2.2 帶 URL參數(shù)的路由
urlpatterns = [
path('app2/show/<int:id>/', views.show),
# <參數(shù)數(shù)據(jù)類型: 參數(shù)名稱>
]
| 參數(shù)數(shù)據(jù)類型 | 說明 |
|---|---|
| str | 任意非空字符,不包含“/”,默認(rèn)類型 |
| int | 匹配0和正整數(shù) |
| slug | 匹配任何ASCII字符、連接符和下劃線 |
| uuid | 匹配一個UUID格式的字符串,該對象必須包括"-",所有字母必須小寫。 |
2.3 re_path()方法正則匹配復(fù)雜路由
| 正則表達(dá)式 | 說明 |
|---|---|
| . | 匹配任意單個字符 |
| \d | 匹配任意一個數(shù)字 |
| \w | 匹配字母、數(shù)字、正劃線 |
| * | 匹配0個或多個字符 |
| [a-z] | 匹配a~z中任意一個小寫字符 |
| 匹配1~5個字符 |
urlpatterns = [
re_path(r'app/page/(?P<page>\d+)&key=(?P<key>\w+)', views.article_page,name='article_page'),
# page:匹配數(shù)字
# key:匹配字母、數(shù)字、正劃線
]
2.4 反向解析路由
urlpatterns = [
path('app/url_reverse', views.url_erverse, name='app_url_reverse'),
]
# 視圖函數(shù)使用反向解析
from django.urls import reverse
def url_reverse(request):
return render(reverse('app_url_reverse'))
# 在模板使用反向解析
<div>
{% url 'app_url_reverse' %}
</div>
2.5 視圖函數(shù)
2.5.1 HttpRequest對象
| 屬性/方法 | 含義 |
|---|---|
| path | 字符串,表示請求頁面的路徑,不包含域名 |
| method | 字符串,表示頁面的請求方法,常用值包括“GET”和“POST”。必須使用大寫方式 |
| encoding | 字符串,表示提交的數(shù)據(jù)的編碼方式。一般默認(rèn)為UTF-8編碼方式 |
| GET | 字典類型,包含GET請求方法中的有所參數(shù) |
| POST | 字典類型,包含POST請求方法中的有所參數(shù) |
| FILES | 字典類型,包含上傳文件的信息 |
| COOKIES | 字典類型,包含所有的Cookies對象 |
| session | 字典類型,表示當(dāng)前的會話 |
| META | 字典類型,包含所有的HTTP頭部信息,如HTTP_USER_AGENT(客戶端Agent信息)、REMOTE_ADDR(客戶端的IP地址)等 |
2.5.2 HttpResponse對象
| 屬性 | 含義 |
|---|---|
| content | 返回的內(nèi)容 |
| status_code | 返回的HTTP響應(yīng)狀態(tài)碼 |
| content-type | 返回的數(shù)據(jù)的MIME類型,默認(rèn)為text/html |
- 常用狀態(tài)碼status_code
| 狀態(tài)碼 | 含義 |
|---|---|
| 200 | 狀態(tài)成功 |
| 301 | 永久重定向,Location屬性的值為當(dāng)前URL |
| 302 | 臨時重定向,Location屬性的值為新的URL |
| 404 | URL未發(fā)現(xiàn),不存在 |
| 500 | 內(nèi)部服務(wù)器錯誤 |
| 502 | 網(wǎng)關(guān)錯誤 |
| 503 | 服務(wù)不可用 |
2.5.3 視圖處理函數(shù)的使用
-
render()
render(request, template_name,content=None,content_typw=None,status=None,using=None)- request: 傳遞給視圖函數(shù)的所有請求,其實就是視圖函數(shù)的參數(shù)request
- template_name:渲染的模板文件,一般放在templates目錄下
- content:數(shù)據(jù)格式為字典類型,保存要傳遞到HTML文件中的變量
- content_type:用于生成文檔的MIME類型。默認(rèn)為text/html
- status:表示響應(yīng)的狀態(tài)代碼,默認(rèn)為200
- using:設(shè)置模板引擎,用于解析模板文件
-
redirect():實現(xiàn)頁面重定向
三、DJango模板
3.1 變量
- {{ var }}:直接調(diào)用變量
- {{ lst.0 }}:根據(jù)索引調(diào)用列表
- {{ dicts.name }}:根據(jù)key調(diào)用字典
3.2 模板標(biāo)簽
| 模板標(biāo)簽 | 描述 |
|---|---|
| {% if %} | 條件判斷模板標(biāo)簽 |
| {% for foo in %} | 循環(huán)模板標(biāo)簽 |
| 路由配置地址標(biāo)簽 | |
| 模板繼承標(biāo)簽,從xx模板繼承 | |
| 加載相關(guān)內(nèi)存 | |
| 靜態(tài)資源 | |
| {% block %} | 一組占位符標(biāo)簽,需要重寫模板 |
| 用來防護(hù)跨站請求偽造攻擊 | |
| 包含一個HTML頁面 |
- 循環(huán)模板標(biāo)簽
| 變量 | 含義 |
|---|---|
| forloop.counter | 表示當(dāng)前循環(huán)的索引,從1開始計數(shù) |
| forloop.counter0 | 表示當(dāng)前循環(huán)的索引,從0開始計數(shù) |
| forloop.revcounter | 表示循環(huán)中剩余元素的數(shù)量。在進(jìn)行第1次循環(huán)時,forloop.revcounter的值是循環(huán)的序列中元素的總數(shù)。在進(jìn)行最后一次循環(huán)時,forloop.revcounter的值是1 |
| forloop.revcounter0 | 表示循環(huán)中剩余元素的數(shù)量。在進(jìn)行第1次循環(huán)時,forloop.revcounter的值是循環(huán)的序列中元素的總數(shù)。在進(jìn)行最后一次循環(huán)時,forloop.revcounter的值是0 |
| forloop.first | 表示是否是第1次循環(huán) |
| forloop.last | 表示是否是最后一次循環(huán) |
| forloop.parentloop | 在嵌套循環(huán)中,獲取上層的for循環(huán) |
3.3.模板過濾器
| 模板過濾器 | 格式 | 描述 |
|---|---|---|
| safe | {{ name|safe }} | 關(guān)閉HTML標(biāo)簽和JavaScript腳本的語法標(biāo)簽的自動轉(zhuǎn)義功能 |
| length | {{ name|length }} | 獲取模板變量的長度 |
| default | {{ name|default:"默認(rèn)值" }} | 當(dāng)變量的值為False時,顯示默認(rèn)值 |
| date | {{ name|date:"Y-m-d G:i:s" }} | 格式化輸出時間日期變量 |
| upper | {{ name|upper }} | 將字符串轉(zhuǎn)為大寫 |
| lower | {{ name|lower }} | 將字符串轉(zhuǎn)為小寫 |
| slice | {{ name|slice:"2:4"}} | 以切片方式獲取字符串中的一部分,和Python中切片語法一樣 |
-
日期過濾器格式化
- Y表示年:格式為4位。y表示兩位的年。
- m表示月:格式01、02、12等。
- d表示日:格式01、02等。
- j表示日:格式為1、2等。
- H表示二十四進(jìn)制的"時",h表示十二進(jìn)制的"時"。
- i表示分:值為0~59。
- s表示秒:值為0~59。
-
自定義過濾器
-
在應(yīng)用下創(chuàng)建templatetags的包
-
在包下創(chuàng)建myfilter.py文件
-
編寫自定義過濾器并注冊
from django import template register = template.Library() @register.filter # 指明show_title函數(shù)是一個過濾器 def show_title(value, n): # value指的是文章標(biāo)題 n指標(biāo)題要顯示的長度 if len(value) > n: return f'{value[0:n]}...' else: return value- 模板調(diào)用過濾器
{% load show_title %} -
四、使用數(shù)據(jù)庫models
4.1 常用模型字段
| 模型字段 | 說明 | MySQL數(shù)據(jù)庫對應(yīng)的字段類型 |
|---|---|---|
| AutoField | 數(shù)據(jù)庫中的自動增長類型,相當(dāng)于ID自動增長的IntegerField類型字段 | Int類型 |
| BooleanField | 一個真/假(true/false)的布爾類型字段 | Tinyint類型 |
| CharField | 字符類型字段 | varChar類型 |
| DateField | 日期字段 | Date類型 |
| DateTimeField | 日期時間類型字段 | DateTime類型 |
| IntergerField | 整數(shù)類型字段 | Int類型 |
| TextField | 長文本類型字段 | Longtext類型 |
| TimeField | 時間類型字段 | Time類型 |
| FloatField | 浮點數(shù)類型字段 | Double類型 |
| FileField | 文件類型字段 | varChar類型 |
| ImageField | 圖像類型字段 | varChar類型 |
| DecimalField | 數(shù)值型類型字段 | Decimal類型 |
- 數(shù)字型字段DecimalField
- max_digits:數(shù)字允許的最在位數(shù)
- decimal_places:小數(shù)的最大位數(shù)
- 時間日期類型字段
- auto_now_add:默認(rèn)為False,設(shè)置為True自動添加創(chuàng)建時間
- auto_now:默認(rèn)為False,設(shè)置為True自動添加修改時間
4.2 常用字段參數(shù)
| 字段參數(shù) | 含義 |
|---|---|
| verbose_name | 設(shè)置字段的顯示名稱 |
| primary_key | 設(shè)置字段為主鍵 |
| editable | 是否可以編輯,一般用于Admin后臺 |
| max_length | 設(shè)置字段的最大長度 |
| blank | 若為True,則該字段允許為空值,在數(shù)據(jù)庫中表現(xiàn)為空字符串。默認(rèn)為False |
| null | 若為True,則該字段允許為空值,在數(shù)據(jù)庫中表現(xiàn)為null。默認(rèn)為False |
| default | 設(shè)置字段的默認(rèn)值 |
| choices | 設(shè)置字段的可選值 |
| db_column | 設(shè)置表中的列名稱,如果不設(shè)置,則將字段名作為列名稱 |
| db_index | 數(shù)據(jù)庫中的字段是否可以建立索引 |
| unique | 數(shù)據(jù)庫中字段是否可以建立 唯一索引 |
| error_messages | 自定義錯誤信息(字典類型) |
| validators | 自定義錯誤驗證(列表類型) |
4.3 Meta類
| 參數(shù) | 含義 |
|---|---|
| abstract | 若為True,則該模型類為抽象類 |
| db_table | 設(shè)置模型對象的數(shù)據(jù)表名稱。若不設(shè)置,則默認(rèn)設(shè)置數(shù)據(jù)表名稱為"應(yīng)用名+下劃線+模型類名" |
| managed | 默認(rèn)為True.Django會管理數(shù)據(jù)表的生命周期,包括遷移等 |
| ordering | 模型對象返回的記錄結(jié)果集按照那個字段排序。一般如下設(shè)置:Ordering=["create_date"]:按照創(chuàng)建時間升序排序,Ordering=["-create_date"]:按照創(chuàng)建時間降序排列,Ordering=["-create_date","orderid"]:按照創(chuàng)建時間降序排列,再以訂單編號升序排列 |
| verbose_name | 模型類在后臺管理中顯示的名稱,一般為中文 |
| index_logether | 多個字段的聯(lián)合索引 |
| unique_together | 多個字段 的聯(lián)合約束 |
# explame
class Meta:
managed=False # 不做數(shù)據(jù)遷移等操作
verbose_name='人員基本信息' # 顯示信息
db_table = 'UerBaseInfo' # 設(shè)置數(shù)據(jù)庫中的表名
4.4 模型中的關(guān)系
4.4.1 一對一關(guān)系OneToOneField()
-
參數(shù)表
參數(shù) 含義 to 要進(jìn)行關(guān)聯(lián)的模型名稱 to_field 要進(jìn)行關(guān)聯(lián)的表的字段名稱 on_delete 在刪除關(guān)聯(lián)表中的數(shù)據(jù)時使用的配置選項 - ondelete參數(shù)配置選項表
配置選項 含義 CASCADE 在刪除基本信息表時一并刪除擴(kuò)展表的信息,即級聯(lián)刪除 PROTECT 在刪除基本信息表時采用保護(hù)機(jī)制拋出錯誤,即不刪除擴(kuò)展表的內(nèi)容 SET_NULL 只有當(dāng)字段屬性null=True時才將關(guān)聯(lián)的內(nèi)容置空 SET_DEFAULT 設(shè)置為默認(rèn)值 SET 設(shè)置為指定的值 DO_NOTHING 刪除基本信息表,對擴(kuò)展表不做任何操作
4.4.2 一對多關(guān)系ForeignKey()
| 參數(shù) | 含義 |
|---|---|
| to | 要進(jìn)行關(guān)聯(lián)的模型名稱 |
| to_field | 要進(jìn)行關(guān)聯(lián)的表的字段名稱 |
| on_delete | 在刪除關(guān)聯(lián)表中的數(shù)據(jù)時使用的配置選項 |
| related_name=None | 在反向操作時使用的字段名,用于代替【表名_set】。如obj.表名_set.all() |
| related_query_name=None | 在反向操作時使用的連接前綴, 用于替換【表名】。如modles.UserGroup.objects.filter(表名_字段名=1).values('表名_字段名') |
| db_constraint=True | 是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束 |
4.4.3 多對多關(guān)系
| 參數(shù) | 含義 |
|---|---|
| to | 要進(jìn)行關(guān)聯(lián)的模型名稱 |
| db_constraint=True | 是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束 |
| db_table=None | 默認(rèn)創(chuàng)建的多對多關(guān)系表的表名 |
4.5 配置項目文件
- setting配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 配置為mysql
'NAME': 'shop-test', # 數(shù)據(jù)庫名
'USER': 'root', # 數(shù)據(jù)庫登錄賬戶
'PASSWORD': '123456', # 登錄密碼
'HOST': 'localhost', # 數(shù)據(jù)庫IP地址
'PORT': '3306', # 數(shù)據(jù)庫端口號
# 取消外鍵約束
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
}
}
}
- 執(zhí)行命令
# 生成遷移文件
python manage.py makemigrations
# 執(zhí)行遷移
python manage.py migrate
4.5.1 配置日志打印輸出
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}
4.6 ORM
- all()方法 :獲取模型的QuerySet對象,即獲取所有的數(shù)據(jù)。
- filter()方法:返回一個QuerySet對象,如果滑獲取數(shù)據(jù),則返回空的QuerySet對象。
模型類.objects.filter(字段=值)
- get()方法:查詢數(shù)據(jù)表記錄,以模型對象的形式返回符合要求的一條數(shù)據(jù)。當(dāng)沒有查詢到結(jié)果或者超過一條記錄,會出現(xiàn)錯誤提示。
- exclude()方法:該方法排除符合條件的數(shù)據(jù),返回QuerySet對象。
模型類.objects.exclde(字段=值)
| 操作符 | 含義 | 具體使用 |
|---|---|---|
| __gt | 大于 | filter(age__gt=20) |
| __gte | 大于等于 | filter(age__gte=20) |
| __lt | 小于 | filter(age__lt=20) |
| __lte | 小于等于 | filter(age__lte=20) |
| __in | 在某個列表內(nèi) | filter(sex__in=[1,0]) |
| __contains | 模糊匹配 | filter(username__contains='張') |
| __year | 日期字段的年份 | filter(createdate__year=2022) |
| __month | 日期字段的月份 | filter(createdate__month=10) |
| __day | 日期字段的天數(shù) | filter(createdate__day=2) |
- values()方法:提取指定需要的字段 。它返回一個QuerySet對象。
- distinct()方法:該方法用于去除重復(fù)數(shù)據(jù)。它返回一個QuerySet對象。
4.6.1 查詢數(shù)據(jù)
- all()
- filter()
- get()
4.6.2 新增數(shù)據(jù)
- 使用save()方法新增數(shù)據(jù)
from app import models
depart=models.DepartInfo(departname="技術(shù)部")
depart.save()
- 使用create()方法新增
UserBaseInfo.objects.create(username="張三",password="123456")
4.6.3 更新數(shù)據(jù)
- 單條數(shù)據(jù)更新
one_user = UserExtraInfo.objects.get(id=1)
one_user.username="王五"
one_user.save()
- 多條數(shù)據(jù)更新
models.objects.update(status=1) # 所有用戶狀態(tài)更新為1
4.6.4 刪除數(shù)據(jù)
- 刪除單選數(shù)據(jù)
UserBasicInfo.objects.get(id=1).delete()
- 刪除多選數(shù)據(jù)
UserBasicInfo.objects.filter(status=2).delete()
- 刪除全部數(shù)據(jù)
UserBasicInfo.objects.all().delete()
4.6.5 操作關(guān)聯(lián)表
-
一對一關(guān)聯(lián)表操作
-
一對多關(guān)聯(lián)表操作
-
多對多關(guān)聯(lián)表操作
-
select_related()方法
cards = models.CardInfo.objects.select_related("user")
- prefetch_related()方法:同select_related()方法類似,用于解決“多對一”和“多對多”關(guān)系的查詢問題。
skills = SkillInfo.objects.prefetch_related("user")
4.6.6 F()函數(shù)和Q()函數(shù)
- F()函數(shù):用于實現(xiàn)數(shù)據(jù)表中字段 的各種運算操作。
from django.db.models import F
# 給所有用戶+1000
users = UserExtraInfo.objects.all()
for user in users:
user.salary+=1000
user.save()
# 使用F增加效率
for user in users:
user.salary=F("salary")+100
user.save()
- Q()函數(shù):用于對象進(jìn)行多條件查詢。
from django.db.models import Q
user = UserExtraInfo.objects.filter(Q(age__gt=30)&Q(salary__gt=5000))
4.7 執(zhí)行原生SQL
-
Raw()方法返回RawQuerySet對象
django.db.models.Manager.raw(raw_query)-
基本使用
UserExtraInfo.objects.raw("select * from userbaseinfo") -
條件查詢(帶參數(shù))
name="張三" sql='''select * from userextrainfo where username=%s''' users = UserExtraInfo.objects.raw(sql,[name]) -
-
游標(biāo)方法
- 插入數(shù)據(jù)
from django.db import connection import django.utils.timezone as timezone cursor = connection.cursor() insertsql="insert into departinfo(departname,createdate) values(%s,%s)" data = ('總經(jīng)辦',timezone.now()) cursor.exectue(insertsql,data) cursor.close()- 查詢數(shù)據(jù)
from django.db import connection cursor = connection.cursor() cursor.exectue("select * from userextrainfo") row = cursor.fetchone() # 以元組方式返回一條記錄 print(row) cursor.close()- 更新數(shù)據(jù)
from django.db import connection cursor = connection.cursor() try: updatesql = 'update departinfo set departname=%s where id=%s' data=('銷售部', 2) cursor.execute(updatesql,data) rowcount=cursor.rowcount # 影響行數(shù) connection.commit() except: connection.rollback() # 返回參數(shù)為影響行數(shù)- 刪除數(shù)據(jù)
cursor=connection.cursor() sql="delete from departinfo where departname = %s" data=["總經(jīng)辦"] cursor.execute(sql,data) cursor.close()4.8 事務(wù)處理
4.8.1 裝飾器方式
from django.db import transaction @transaction.atomic # 裝飾器 def trans(request): # 開啟事務(wù) save_id=transaction.savepoint() try: # 代碼操作 1 # 代碼操作 2 # 提交從保存點以當(dāng)前狀態(tài)的所有數(shù)據(jù)庫事務(wù)操作 transaction.savepoint_commit(save_id) except: # 事務(wù)回滾,回滾到保存點 transaction.savepoint_rollback(save_id)4.8.2 with語句方式
def trans_with(request): with transaction.atomic(): # with語句 # 開啟事務(wù) save_id = transaction.savepoint() try: # 代碼操作 1 # 代碼操作 2 # 提交從保存點以當(dāng)前狀態(tài)的所有數(shù)據(jù)庫事務(wù)操作 transaction.savepoint_commit(save_id) except: # 事務(wù)回滾,回滾到保存點 transaction.savepoint_rollback(save_id)
五、基于Django表單
5.1 HTML表單
| 標(biāo)簽 | 說明 |
|---|---|
<form> |
表單標(biāo)簽 |
<input type=text> |
文本框標(biāo)簽 |
<input type=password> |
密碼輸入框標(biāo)簽 |
<input type=radio> |
單選框標(biāo)簽 |
<input type=checkbox> |
復(fù)選框標(biāo)簽 |
<input type=button> |
按鈕標(biāo)簽 |
<input type=submit> |
提交按鈕標(biāo)簽 |
<input type=reset> |
重置按鈕標(biāo)簽 |
<input type=file> |
文件上傳標(biāo)簽 |
<textarea> |
多選文本標(biāo)簽 |
<label> |
顯示文本標(biāo)簽 |
<select> |
下拉列表框標(biāo)簽 |
<option> |
下拉列表框中的選項 |
5.2 Form表單
form表單,用于生成頁面可用的HTML標(biāo)簽。用戶在表單中輸入數(shù)據(jù)提交表單時,Django框架會自動進(jìn)行表彰數(shù)據(jù)驗證,并將數(shù)據(jù)綁定到表單對象。
| 表單字段 | 說明 |
|---|---|
| CharField | 字符型字段,默認(rèn)在界面上顯示一個文本輸入標(biāo)簽。如<input type='text' ...> |
| InterField | 數(shù)值類型字段,默認(rèn)在界面上顯示 一個數(shù)字輸入標(biāo)簽。如<input type='number'...> |
| FloatField | 數(shù)值類型字段,默認(rèn)在界面上顯示一個數(shù)字輸入標(biāo)簽。如<input type='number'...> |
| DecimalField | 數(shù)值類型字段,默認(rèn)在界面上顯示<input>類型的數(shù)字輸入標(biāo)簽。如<input type='number'...> |
| ChoiceField | 選擇屬性字段,默認(rèn)在界面上顯示一個下拉列表標(biāo)簽。如<select name="city" id="city" ...> |
| FileField | 文件屬性字段,默認(rèn)在界面上顯示 一個文件域標(biāo)簽。如<input type='file'...> |
| BooleanField | 布爾類型字段,默認(rèn)在界面上顯示 一個復(fù)選框標(biāo)簽。如<input type='checkbox'...> |
| DateField | 日期屬性字段,默認(rèn)顯示 一個文本輸入標(biāo)簽,可以自動驗證日期格式。<input type='text' ...> |
| DateTimeField | 日期時間屬性字段,默認(rèn)顯示 一個文本輸入標(biāo)簽,可以自動驗證日期時間格式。如<input type='text' ...> |
| EmailField | 郵件屬性字段,默認(rèn)顯示一個郵件輸入標(biāo)簽。如<input type='email'...> |
| UrlField | URL地址屬性字段,默認(rèn)顯示一個URL地址輸入標(biāo)簽,可以自動校驗URL格式的合法性。如<input type='text' ...> |
| ModelChoiceField | 如果使用了該字段,則可以直接從數(shù)據(jù)庫中獲取數(shù)據(jù)生成下拉 列表組件。<select name="city" id="city" ...> |
- ChoiceField
Forms.ChoiceField(choices=((None,'請選擇'),(0,'正常'),(1,'無效'),))
- 時間日期類型字段
Forms.DateTimeField(input_format=["%Y-%m-%d %H:%M"])
Forms.DateField(input_format=["%Y-%m-%d"])
- 選擇類型字段ModelChoiceField
Forms.ModelChoiceField(queryset=DepartInfo.objects.all(), empty_label="請選擇")
5.2.1 常用字段
| 字段參數(shù) | 說明 |
|---|---|
| label | 生成HTML中的label標(biāo)簽 |
| label_suffix | Label標(biāo)簽后的統(tǒng)一后綴信息 |
| initial | 字段的初始值 |
| help_text | 字段的描述信息 |
| error_messages | 指定錯誤信息 |
| validators | 指定字段的驗證規(guī)則 |
| required | 字段是否可以為空,默認(rèn)為True |
| disabled | 字段是否可以編輯 |
| widget | 指定字段HTML標(biāo)簽樣式 |
- 表單元素風(fēng)格(widget)
| widget | 說明 |
|---|---|
| PasswordInput | 密碼輸入標(biāo)簽 |
| HiddenInput | 隱藏元素輸入標(biāo)簽 |
| Textarea | 文本域標(biāo)簽 |
| CheckboxInput | 復(fù)選框標(biāo)簽 |
| FileInput | 文件域標(biāo)簽 |
| RadioInput | 單選按鈕標(biāo)簽 |
| DateTimeInput | 日期時間標(biāo)簽 |
| Select | 下拉列表標(biāo)簽 |
| SelectMuliple | 下拉多選列表標(biāo)簽 |
- explame
from django import forms
class UserInfoForm(forms.Form):
STATUS=((None, '請選擇'),(0,'正常'),(1, '無效'),)
username=forms.CharField(label="用戶名",min_length=6,
widget=forms.widgets.TextInput(attrs={
'class':'form-control',
'placeholder':'請輸入用戶名'
}))
password=forms.CharField(label="密碼",min_length=6,
widget=forms.widgets.TextInput(attrs={
'class':'password',
},render_value=True))
5.2.2 表單數(shù)據(jù)校驗
| 表單屬性或方法 | 說明 |
|---|---|
| is_valid()方法 | 驗證表單中的數(shù)據(jù)是否合法 |
| cleand_data屬性 | 獲取表單中通過驗證的數(shù)據(jù) |
| errors屬性 | 表單驗證錯誤信息 |
- 自定義驗證規(guī)則
from django.core.exceptions import ValidationError
imoprt re
def mobile_validate(value):
# 手機(jī)號正則判斷
mobile_re=re.compile(r'^(13[0-9]|15[0123456789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手機(jī)號碼格式錯誤')
def age_validate(value):
if value<1 | value>120:
raise ValidationError('年齡范圍為1~120歲')
5.3 Django的模型表單
from app.models import *
class UserInfoModelForm(forms.ModelForm):
class Meat:
# 定義關(guān)聯(lián)模型
model=UserBaseInfo
# 定義需要在表單中展示的字段
fields=['username','password','age','mobile','status']
# 如果要顯示全部字段,則可以如下設(shè)置
# fileds="__all__"
- 模型表單屬性表
| 模型表單屬性 | 含義 |
|---|---|
| model | 用于綁定已有的模型 |
| fields | 設(shè)置模型中的哪些字段可以顯示。如果將值設(shè)為__all__,則顯示全部字段。如果要顯示部分字段,則將部分字段寫入一個列表或元組中 |
| exclude | 禁止將模型字段轉(zhuǎn)換為表單字段。用法同fields |
| labels | 設(shè)置表單字段的label項,以字典方式表示 ,字典的鍵為模型的字段 |
| widgets | 設(shè)置表單字段的渲染效果,以字典方式表示,字典的鍵為模型的字段 |
| help_texts | 設(shè)置表單字段的幫助信息 |
| error_messages | 設(shè)置表單字段 的錯誤信息 |
5.3.1 校驗數(shù)據(jù)
from app.models import *
class UserBaseInfoModelForm(forms.ModelForm):
class Meta:
# 定義關(guān)聯(lián)模型
model=UserBaseInfo
# 定義需要在表單中展示的字段
fields=['username','password','age','mobile','status']
# 如果要顯示全部字段,則可以進(jìn)行如下設(shè)置
# fields="__all__"
# 如果在Models中定義了名稱,則在這里不用再定義
labels={
'age':'年齡',
"mobile":"手機(jī)信息",
}
# 將文本框渲染為密碼輸入框
widgets={
"password":forms.widgets.PasswordInput(attrs={"class":"password"},render_value=True)
}
error_message={
"username":{'required':"用戶姓名不能為空","min_length":"長度最少6們",'invalid':'輸入正確的用戶姓名'},
"password":{'max_length':'密碼最長10位','required':'密碼不能為空','min_length':'密碼最少6位'},
"age":{'required':'年齡不能為空'},
"mobile":{'required':'手機(jī)號不能為空'},
"status":{'required':'用戶狀態(tài)不能為空'}
}
5.3.2 自定義校驗函數(shù)
# 校驗手機(jī)號碼的局部鉤子函數(shù)
def clean_mobile(self):
mobile = self.cleaned_data.get('mobile')
mobile_re=re.compile(r'^(13[0-9]|15[0123456789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(mobile):
raise ValidationError('手機(jī)號碼格式錯誤')
return mobile
# 全局鉤子函數(shù)
def clean(self):
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
raise forms.ValidationError('二次密碼輸入不一致')
5.4使用AJAX提交表單
<scripts>
$("#submit").click(funtion(){
$.ajax({
url:"/ajax_login/",
async:true,
type:"post",
data:{
"username":username,
"password":password,
"csrfmiddlewaretoken":$('[name=csrfmiddlewaretoken]').val(),
},
success:function(data){
console.log(data)
},
error:function(data){
console.log("error")
}
})
})
</scripts>
六、用戶認(rèn)證
6.1 Auth模塊
| 模塊名稱 | 說明 |
|---|---|
| Django.contrib.auth.models.User | Auth模塊中的用戶模型 |
| Django.contrib.auth.models.Group | Auth模塊中的用戶組模型 |
| Django.contrib.auth.models.Permission | Auth模塊中的權(quán)限模型 |
- 內(nèi)置字段
| 字段 | 說明 | 字段類型 |
|---|---|---|
| id | 數(shù)據(jù)庫主鍵 | int |
| password | 密碼 | varchar |
| last_login | 最近登錄的時間 | datetime |
| is_superuser | 是否為超級管理員 | tinyint |
| username | 用戶賬號 | varchar |
| first_name | 用戶名字 | varchar |
| last_name | 用戶姓氏 | varchar |
| 郵箱 | varchar | |
| is_staff | 是否登錄admin后臺 | tinyint |
| is_active | 用戶狀態(tài)是否激活 | tinyint |
| date_joined | 賬號的創(chuàng)建時間 | datetime |
- Auth模塊的相關(guān)方法
| 方法 | 說明 |
|---|---|
| authenticate(username,pasword) | 用戶驗證功能,如果認(rèn)證成功,則返回一個User對象 |
| login(HttpRequest,user) | 用戶登錄功能,其中,user為一個經(jīng)過認(rèn)證的User對象。登錄成功后將用戶身份信息記錄到請求的會話對象中存儲。使用request.user可以獲取當(dāng)前用戶的用戶對象。如果未登錄,則request.user得到一個匿名用戶對象AnonymousUser |
| is_authenticated() | 判斷當(dāng)前用戶是否經(jīng)過認(rèn)證 |
| logout() | 清除當(dāng)前請求,注銷會話 |
| create_user() | 創(chuàng)建新用戶,至少提供用戶名和密碼 |
| set_password(password) | 修改密碼 |
| check_password(password) | 檢查密碼是否正確 |
6.2 擴(kuò)展用戶模型
用戶模型中的字段是有限的,無法滿足實際業(yè)務(wù)需求。
# 一、models創(chuàng)建
from django.db import models
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
photo = models.ChafrField('用戶頭像',max_length=50)
weChat=models.CharField('微信',max_length=30)
level=models.CharField('用戶等級',max_length=1)
def __str__(self):
return self.username
# 二、setting.py添加如下
AUTH_USER_MODEL="app.MyUser"
# 三、數(shù)據(jù)遷移
python manage.py makemigrations
python manage.py migrate
6.3 權(quán)限管理
6.3.1 裝飾器權(quán)限
| 裝飾器 | 含義 |
|---|---|
| login.required | 用戶身份認(rèn)證資源訪問裝飾器,驗證用戶是否通過身份認(rèn)證。如果通過認(rèn)證,則允許該用戶訪問該裝飾器關(guān)聯(lián)的函數(shù),否則跳轉(zhuǎn)到login_url參數(shù)所指定的登錄地址。如果不提供login_url參數(shù),則跳轉(zhuǎn)到setting.py中的LOGIN_URL路徑 |
| permission_required | 數(shù)據(jù)資源訪問裝飾器,驗證用戶是否擁有指定權(quán)限。如果通過認(rèn)證了,則允許該用戶訪問該裝飾器關(guān)聯(lián)的函數(shù),否則跳轉(zhuǎn)到login_url參數(shù)所指定的登錄 地址。如果不提供login_url參數(shù),則跳轉(zhuǎn)到setting.py中的LOGIN_URL路徑 |
| Require_GET | 請求訪問限制裝飾器,只允許使用GET方式訪問函數(shù) |
| Require_POST | 請求訪問限制裝飾器,只允許使用POST方式訪問函數(shù) |
在用戶通過身份認(rèn)證后,可以通過以下方法進(jìn)行用戶組和權(quán)限的增加、刪除、修改和查詢
| 方法 | 含義 |
|---|---|
| user.groups.set(group1,group2) | 為指定用戶配置用戶組 |
| user.groups.remove(group1,group2) | 從指定用戶組中刪除用戶 |
| user.groups.clear() | 將用戶從所有的用戶組中刪除 |
| user.user_permissions.set(per1,per2) | 為指定的用戶配置權(quán)限 |
| user.user_permissions.remove(per1,per2) | 刪除當(dāng)前用戶的權(quán)限中指定的權(quán)限 |
| user.user_permissions.clear() | 刪除當(dāng)前用戶所有的權(quán)限 |
| user.has_perm('app.add_departinfo') | 檢查用戶是否擁有app應(yīng)用的departinfo模型的添加權(quán)限 |
6.3.2 中間件技術(shù)
- 方法
| 方法 | 說明 |
|---|---|
| process_request(self,request) | 在處理請求前在每個請求上調(diào)用,返回None或HttpResponse對象 |
| process_view(self,request,callback,callback_args,callback_kwargs) | 在處理視圖前在每個請求上調(diào)用,返回None或HttpResponse對象 |
| process_emplate_response(self,request,response) | 如果views()函數(shù)中返回的對象中具有render()方法,則直接執(zhí)行該方法。在每個請求上調(diào)用,返回實現(xiàn)了render()方法的響應(yīng)對象 |
| process_exception(self,request,exception) | 在視圖拋出異常時調(diào)用,在每個請求上調(diào)用,返回一個HttpResponse對象 |
| process_response(self,request,response) | 在處理響應(yīng)后,所有響應(yīng)返回瀏覽器之前被調(diào)用,在每個請求上調(diào)用,返回HttpResponse對象 |
-
自定義中間件
- 在項目根目錄創(chuàng)建類:my_middleware.py
from django.utils.deprecation import MiddlewareMixin class test(MiddlewareMixin): def process_request(self) pass- 在setting.py中MIDDLEWARE添加
my_middleware.test
-
中間件簡化權(quán)限認(rèn)證
- 新建文件permimiddleware
from django.shorttcuts import HttpResponse,render,redirect
from django.utils.deprecation import MiddlewareMixin
import re
class PermissionMiddleWare(MiddlewareMixin):
def process_request(self,request):
# 獲取當(dāng)前路徑
curr_path = request.path
# 白名單處理
white_list=["/myuser_login","/myuser_reg/"]
for w in white_list:
if re.search(w, curr_path):
return None # 通過
# 驗證是否通過
if not request.user.is_authenticated:
return redirect("/app/myuser_login")
- 配置中間件
# setting.py
MIDDLEWARE=[
...
'app.middle.permiddleware.PermissionMiddleWare',
]

浙公網(wǎng)安備 33010602011771號