1. DJANGO使用指南
Django簡(jiǎn)介:
Django發(fā)布于2005年7月嘉熊,是當(dāng)前Python世界里最有名且成熟的網(wǎng)絡(luò)框架狮斗。 最初是被開(kāi)發(fā)用于管理勞倫斯出版集團(tuán)旗下的以新聞內(nèi)容為主的網(wǎng)站的,即CMS(內(nèi)容管理系統(tǒng))軟件。
Django是一個(gè)用Python編寫(xiě)的開(kāi)放源代碼的Web應(yīng)用框架郁岩,代碼是開(kāi)源的。此系統(tǒng)采用了MVC的框架模式, 也可以稱為MTV模式
什么是MVC模式
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě)刹缝,一種軟件設(shè)計(jì)典范碗暗,用一種業(yè)務(wù)邏輯、數(shù)據(jù)梢夯、界面顯示分離的方法組織代碼言疗,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí)颂砸,不需要重新編寫(xiě)業(yè)務(wù)邏輯噪奄。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中人乓。 <b>通俗的來(lái)講就是勤篮,強(qiáng)制性的使應(yīng)用程序的輸入,處理和輸出分開(kāi)色罚。</b>
<b>核心思想</b>:解耦
<b>優(yōu)點(diǎn)</b>:減低各個(gè)模塊之間的耦合性碰缔,方便變更,更容易重構(gòu)代碼戳护,最大程度的實(shí)現(xiàn)了代碼的重用
MVC(Model, View, Controller)
Model: 即<font color=red>數(shù)據(jù)存取層</font>手负。用于封裝于應(yīng)用程序的業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù),以及對(duì)數(shù)據(jù)的處理姑尺。說(shuō)白了就是模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)
View: 即<font color=red>表現(xiàn)層</font>竟终。負(fù)責(zé)數(shù)據(jù)的顯示和呈現(xiàn)。渲染的html頁(yè)面給用戶切蟋,或者返回?cái)?shù)據(jù)給用戶统捶。
Controller: 即<font color=red>業(yè)務(wù)邏輯層</font>。負(fù)責(zé)從用戶端收集用戶的輸入柄粹,進(jìn)行業(yè)務(wù)邏輯處理喘鸟,包括向模型中發(fā)送數(shù)據(jù),進(jìn)行CRUD操作驻右。
圖解:
瀏覽器中MVC的表現(xiàn)形式圖解:
Django的模式簡(jiǎn)介
MVT模式
嚴(yán)格來(lái)說(shuō)什黑,Django的模式應(yīng)該是MVT模式,本質(zhì)上和MVC沒(méi)什么區(qū)別堪夭,也是各組件之間為了保持松耦合關(guān)系愕把,只是定義上有些許不同。
Model: 負(fù)責(zé)業(yè)務(wù)與數(shù)據(jù)庫(kù)(ORM)的對(duì)象
View: 負(fù)責(zé)業(yè)務(wù)邏輯并適當(dāng)調(diào)用Model和Template
Template: 負(fù)責(zé)把頁(yè)面渲染展示給用戶
注意: Django中還有一個(gè)url分發(fā)器森爽,也叫作路由恨豁。主要用于將url請(qǐng)求發(fā)送給不同的View處理,View在進(jìn)行相關(guān)的業(yè)務(wù)邏輯處理爬迟。
2. VIRTUALENV虛擬環(huán)境創(chuàng)建指南
前言
本教程中使用到的python版本均為python3.x版本橘蜜,由于本人安裝的是python3.6.3版本,所以一下的課程均是在此基礎(chǔ)上進(jìn)行的付呕。
-
virtualenv使用場(chǎng)景:當(dāng)開(kāi)發(fā)成員負(fù)責(zé)多個(gè)項(xiàng)目的時(shí)候计福,每個(gè)項(xiàng)目安裝的庫(kù)又是有很多差距的時(shí)候跌捆,會(huì)使用虛擬環(huán)境將每個(gè)項(xiàng)目的環(huán)境給隔離開(kāi)來(lái)。
比如象颖,在有一個(gè)老項(xiàng)目已經(jīng)開(kāi)發(fā)維護(hù)了3年了佩厚,里面很多庫(kù)都是比較老的版本了。例如python使用的是2.7版本的力麸。但是新項(xiàng)目使用的python版本是3.6的。為了解決這種項(xiàng)目執(zhí)行環(huán)境的沖突育韩,所以引入了虛擬環(huán)境virtualenv克蚂。
當(dāng)然除了virtualenv可以起到隔離環(huán)境的作用,還有其他技術(shù)方案來(lái)實(shí)現(xiàn)筋讨,而且上線流程簡(jiǎn)單埃叭,大大減輕運(yùn)維人員的出錯(cuò)率,比如每一個(gè)項(xiàng)目使用一個(gè)docker鏡像悉罕,在鏡像中去安裝項(xiàng)目所需的環(huán)境赤屋,庫(kù)版本等等
python環(huán)境的配置
- 在cmd中能通過(guò)python去啟動(dòng),如果不行直接跳到第三步
-
在cmd中能通過(guò)pip3啟動(dòng)安裝軟件壁袄,如果不行直接跳到第三步
image.png
3.配置python環(huán)境和pip環(huán)境
確認(rèn)pip安裝成功类早,如果Scritp文件夾下沒(méi)有pip可執(zhí)行文件,則執(zhí)行第五步嗜逻。
由于python3.6安裝以后涩僻,在Scripts文件中沒(méi)有pip的可執(zhí)行軟件,需要輸入一下命令進(jìn)行安裝
python -m ensurepip
注:現(xiàn)在在python的安裝文件夾Scripts下就有pip.exe以及easy_install.exe等可執(zhí)行文件了栈顷,就可以使用pip安裝啦~
windows中安裝使用
- 安裝virtualenv
pip install virtualenv
- 創(chuàng)建虛擬環(huán)境
先查看一下安裝虛擬環(huán)境有那些參數(shù)逆日,是必須填寫(xiě)的
注意兩個(gè)參數(shù):
--no-site-packages和-p參數(shù)
virtualenv --no-site-packages venv
以下是指定安裝虛擬環(huán)境中的python版本的安裝方式:
- 進(jìn)入/退出env
進(jìn)入 cd env/Scripts/文件夾 在activate命令
退出 deactivate
在pycharm中創(chuàng)建項(xiàng)目方法
ubuntu中安裝使用
- 安裝virtualenv
apt-get install python-virtualenv
- 創(chuàng)建包含python3版本的虛擬環(huán)境
virtualenv -p /usr/bin/python3 env
env代表創(chuàng)建的虛擬環(huán)境的名稱
- 進(jìn)入/退出env
進(jìn)入 source env/bin/activate
退出 deactivate
-
pip使用
查看虛擬環(huán)境下安裝的所有的包
pip list
查看虛擬環(huán)境重通過(guò)pip安裝的包
pip freeze
3. DJANGO使用指南
創(chuàng)建Django項(xiàng)目
cmd命令創(chuàng)建步項(xiàng)目驟步驟:
1、進(jìn)入創(chuàng)建好的虛擬環(huán)境
2萄凤、去到需要放置項(xiàng)目的文件夾下室抽,新建項(xiàng)目
3、創(chuàng)建好項(xiàng)目后拖動(dòng)到pycharm中打開(kāi)
直接用pycharm創(chuàng)建項(xiàng)目步驟:
1. 首先創(chuàng)建一個(gè)運(yùn)行Django項(xiàng)目的虛擬環(huán)境(virtualenv)
虛擬環(huán)境的創(chuàng)建在基礎(chǔ)課程中講解靡努,地址
該虛擬環(huán)境中有django庫(kù)坪圾,python3,pymysql等等需要的庫(kù)
大致在羅列下安裝了那些庫(kù):
pip install Django==1.11
pip install PyMySQL
2. 創(chuàng)建一個(gè)Django項(xiàng)目
2.1 創(chuàng)建項(xiàng)目
django-admin startproject halloWorld
該命令是創(chuàng)建一個(gè)名為halloWorld的工程
項(xiàng)目目錄介紹
下面展示創(chuàng)建以后的文件惑朦,具體有哪些文件:
manage.py: 是Django用于管理本項(xiàng)目的管理集工具神年,之后站點(diǎn)運(yùn)行,數(shù)據(jù)庫(kù)自動(dòng)生成行嗤,數(shù)據(jù)表的修改等都是通過(guò)該文件完成已日。
init.py: 指明該目錄結(jié)構(gòu)是一個(gè)python包,暫無(wú)內(nèi)容栅屏,在后期會(huì)初始化一些工具會(huì)使用到飘千。
seetings.py: Django項(xiàng)目的配置文件堂鲜,其中定義了本項(xiàng)目的引用組件,項(xiàng)目名护奈,數(shù)據(jù)庫(kù)缔莲,靜態(tài)資源,調(diào)試模式霉旗,域名限制等
urls.py:項(xiàng)目的URL路由映射痴奏,實(shí)現(xiàn)客戶端請(qǐng)求url由哪個(gè)模塊進(jìn)行響應(yīng)。
wsgi.py:定義WSGI接口信息厌秒,通常本文件生成后無(wú)需改動(dòng)
2.2 運(yùn)行Django項(xiàng)目
python manage.py runserver 端口
該命令是運(yùn)行項(xiàng)目读拆,端口可以不用寫(xiě),啟動(dòng)的時(shí)候會(huì)默認(rèn)隨機(jī)創(chuàng)建一個(gè)可以使用的端口
2.2 創(chuàng)建app
python manage.py startapp hallo_app
該命令是在blog工程下創(chuàng)建一個(gè)名為hallo_app的app
3. settings.py配置文件詳細(xì)解讀
a) 設(shè)置語(yǔ)言:
LANGUAGE_CODE = 'zh-hans' 表示中文
LANGUAGE_CODE = 'en-us' 表示英文
設(shè)置時(shí)區(qū): TIME_ZONE = 'Asia/Shanghai'
b) 時(shí)區(qū)解釋: (需要詳細(xì)回顧思考時(shí)區(qū)問(wèn)題)
UTC:世界標(biāo)準(zhǔn)時(shí)間鸵闪,也就是平常說(shuō)的零時(shí)區(qū)檐晕。
北京時(shí)間表示東八區(qū)時(shí)間,即UTC+8
模型使用指南--admin
前言
Djang自身集成了管理后臺(tái)蚌讼,在管理后臺(tái)中可以對(duì)我們自定義model進(jìn)行CRUD操作辟灰,也能進(jìn)行列表展示解析,分頁(yè)等等
使用admin管理后臺(tái)
0. 準(zhǔn)備工作篡石,在model中定義Student的模型
```
class Students(models.Model):
name = models.CharField(max_length=10)
sex = models.BooleanField()
class Meta:
db_table = 'student'
```
1. admin管理后臺(tái)的url
在工程目錄下可以看到路由配置中有一個(gè)admin的url地址
```
url(r'^admin/', admin.site.urls),
```
2. 創(chuàng)建admin后臺(tái)的用戶密碼
```
python manage.py createsuperuser
```
[圖片上傳失敗...(image-4a4434-1536808795504)]
3. 在登錄后的管理后臺(tái)中對(duì)自定義的模型進(jìn)行CRUD操作
在管理后臺(tái)中操作模型對(duì)象芥喇。需要在app的admin.py中寫(xiě)如下代碼
```
admin.site.register(模型名)
```
4. 繼承admin.ModelAdmin,編寫(xiě)自定義的admin
```
class StudentAdmin(admin.ModelAdmin):
def set_sex(self):
if self.sex:
return '男'
else:
return '女'
set_sex.short_description = '性別'
list_display = ['id', 'name', set_sex]
list_filter = ['sex']
search_fields = ['name']
list_per_page = 1
admin.site.register(模型名, StudentAdmin)
```
其中:<br>
list_display: 顯示字段 <br>
list_filter: 過(guò)濾字段 <br>
search_fields: 搜索字段 <br>
list_per_page: 分頁(yè)條數(shù) <br>
5. 使用裝飾器去實(shí)現(xiàn)注冊(cè)
```
@admin.register(模型名)
class StudentAdmin(admin.ModelAdmin):
def set_sex(self):
if self.sex:
return '男'
else:
return '女'
set_sex.short_description = '性別'
list_display = ['id', 'name', set_sex]
list_filter = ['sex']
search_fields = ['name']
list_per_page = 1
```
模型使用指南--models
前言
Django對(duì)數(shù)據(jù)庫(kù)提供了很好的支持凰萨,對(duì)不同的數(shù)據(jù)庫(kù),django提供了統(tǒng)一調(diào)用的API乃坤,我們可以根據(jù)不同的業(yè)務(wù)需求使用不同是數(shù)據(jù)庫(kù)。Django中引入了ORM(Objects Relational Mapping)對(duì)象關(guān)系映射沟蔑,是一種程序技術(shù)湿诊。在下面會(huì)詳細(xì)的講解。
修改mysql配置
1. 在settings.py中配置數(shù)據(jù)庫(kù)連接信息
'ENGINE':'django.db.backends.mysql',
'NAME':'', #數(shù)據(jù)庫(kù)名
'USER':'', #賬號(hào)
'PASSWORD':'', #密碼
'HOST':'127.0.0.1', #IP(本地地址也可以是localhost)
'PORT':'3306', #端口
2. mysql數(shù)據(jù)庫(kù)中創(chuàng)建定義的數(shù)據(jù)庫(kù)
a) 進(jìn)入mysql
mysql -u root -p
b) 創(chuàng)建數(shù)據(jù)庫(kù)
create database xxx charset=utf-8;
3. 配置數(shù)據(jù)庫(kù)鏈接
a) 安裝pymysql
pip install pymysql
b) 在工程目錄下的init.py文件中輸入,完成數(shù)據(jù)庫(kù)的驅(qū)動(dòng)加載
import pymysql
pymysql.install_as_MySQLdb()
4. 定義模型瘦材,以及模型數(shù)據(jù)的增刪改查
重要概念:模型厅须,表,屬性食棕,字段
一個(gè)模型類在數(shù)據(jù)庫(kù)中對(duì)應(yīng)一張表朗和,在模型類中定義的屬性,對(duì)應(yīng)模型對(duì)照表中的一個(gè)字段
定義屬性見(jiàn)定義屬性文件地址
創(chuàng)建學(xué)生模型類
class Student(models.Model):
s_name = models.CharField(max_length=10)
s_age = models.IntegerField()
s_gender = models.BooleanField()
class Meta:
db_table = 'cd_student'
ordering =[]
對(duì)象的默認(rèn)排序字段簿晓,獲取對(duì)象列表時(shí)使用眶拉,升序ordering['id'],降序ordering['-id']
5.遷移數(shù)據(jù)庫(kù)
a) 生成遷移文件
python manage.py makemigrations
遷移成功會(huì)在migrations文件夾下生成0001_initial.py
注意:如果執(zhí)行后并沒(méi)有生成遷移文件憔儿,一直提示No changes detected這個(gè)結(jié)果的話忆植,就要手動(dòng)的去處理了。有兩點(diǎn)處理方式:
1) 先刪除掉pycache文件夾
2) 直接強(qiáng)制的去執(zhí)行遷移命令,python manage.py makemigrations xxx (xxx就是app的名稱)
3) 查看自動(dòng)生成的數(shù)據(jù)庫(kù)朝刊,查看表django_migrations耀里,刪掉app字段為xxx的數(shù)據(jù)(xxx就是app的名稱)
b) 執(zhí)行遷移生成數(shù)據(jù)庫(kù)
python manage.py migrate
注意: 生成遷移文件的時(shí)候,并沒(méi)有在數(shù)據(jù)庫(kù)中生成對(duì)應(yīng)的表拾氓,而是執(zhí)行migrate命令之后才會(huì)在數(shù)據(jù)庫(kù)中生成表
6. ORM
ORM(Objects Relational Mapping)對(duì)象關(guān)系映射冯挎,是一種程序技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換咙鞍》抗伲可以簡(jiǎn)單理解為翻譯機(jī)。
可以理解為把面向?qū)ο蟮拇a续滋,翻譯成數(shù)據(jù)庫(kù)可以看懂的SQL語(yǔ)句
7.模型查詢
a) 模型成員objects
Django默認(rèn)通過(guò)模型的objects對(duì)象實(shí)現(xiàn)模型數(shù)據(jù)查詢
b) 過(guò)濾器
查詢集表示從數(shù)據(jù)庫(kù)獲取的對(duì)象集合
查詢集可以有多個(gè)過(guò)濾器
過(guò)濾器就是一個(gè)函數(shù)翰守,基于所給的參數(shù)限制查詢的結(jié)果
從SQL角度來(lái)說(shuō),查詢集合和select語(yǔ)句等價(jià)吃粒,過(guò)濾器就像where條件
Django有兩種過(guò)濾器用于篩選記錄
filter : 返回符合篩選條件的數(shù)據(jù)集
exclude : 返回不符合篩選條件的數(shù)據(jù)集
多個(gè)filter和exclude可以連接在一起查詢
當(dāng)然還有如下這些過(guò)濾器:
all() 返回所有數(shù)據(jù)
filter() 返回符合條件的數(shù)據(jù)(數(shù)據(jù)可以有一個(gè)或者多個(gè))潦俺,條件可以有多個(gè)
例:類名.objects.filter(條件1拒课,條件2...)
get() 返回符合條件的一條數(shù)據(jù)徐勃,沒(méi)有數(shù)據(jù)會(huì)報(bào)錯(cuò),返回?cái)?shù)據(jù)太多也報(bào)錯(cuò)
exclude() 過(guò)濾掉符合條件的數(shù)據(jù)
order_by() 排序早像,
升序例:類名.objects.order_by(字段)
降序例:類名.objects.order_by(-字段)
values() 一條數(shù)據(jù)就是一個(gè)字典僻肖,返回一個(gè)列表
c) 查詢單個(gè)數(shù)據(jù)
get():返回一個(gè)滿足條件的對(duì)象。如果沒(méi)有返回符合條件的對(duì)象卢鹦,會(huì)應(yīng)該模型類DoesNotExist異常臀脏,如果找到多個(gè),會(huì)引發(fā)模型類MultiObjectsReturned異常
first():返回查詢集中的第一個(gè)對(duì)象
last():返回查詢集中的最后一個(gè)對(duì)象
count():返回當(dāng)前查詢集中的對(duì)象個(gè)數(shù)
exists():判斷查詢集中是否有數(shù)據(jù)冀自,如果有數(shù)據(jù)返回True揉稚,沒(méi)有返回False
d) 限制查詢集
限制查詢集,可以使用下表的方法進(jìn)行限制熬粗,等同于sql中的limit
模型名.objects.all()[0:5] 下標(biāo)不能為負(fù)數(shù)搀玖;[:100]結(jié)束索引超出范圍不報(bào)錯(cuò);[100:]起始索引超出范圍也不報(bào)錯(cuò)驻呐,返回空
e) 字段查詢
對(duì)sql中的where實(shí)現(xiàn)灌诅,作為方法,filter(),exclude()含末,get()的參數(shù)
語(yǔ)法:屬性名稱__比較運(yùn)算符 = 值
外鍵:屬性名_id
注意:like語(yǔ)句中使用%表示通配符猜拾。比如sql語(yǔ)句查詢 where name like '%xxx%',等同于filter(name_contains='xxx')
f) 比較運(yùn)算符
contains:是否包含佣盒,大小寫(xiě)敏感
例:模型名.objects.filter(字段名__contains='花'):模糊查詢名字中帶有‘花’的名字
startswith挎袜,endswith:以values開(kāi)頭或者結(jié)尾,大小寫(xiě)敏感
以上的運(yùn)算符前加上i(ignore)就不區(qū)分大小寫(xiě)了
例:模型名.objects.filter(字段名__startswith='花'):模糊查詢名字以‘花’開(kāi)頭的名字
isnull,isnotnull:是否為空宋雏。
例:filter(name__isnull=True) :查詢名字為空的學(xué)生
in:是否包含在范圍內(nèi)芜飘。
例:filter(id__in=[1,2,3]) :查詢id在123的
gt,gte磨总,lt嗦明,lte:大于,大于等于蚪燕,小于娶牌,小于等于。
例:filter(age__gt=10) :查詢年齡大于10
pk:代表主鍵馆纳,也就是id诗良。
例:filter(pk=1) :查詢id為1的
g) 聚合函數(shù)
aggregate()函數(shù)返回聚合函數(shù)的值
Avg:平均值
Count:數(shù)量
Max:最大
Min:最小
Sum:求和
例如: Student.objects.aggregate(Max('age'))
h) F對(duì)象/Q對(duì)象
<b>F對(duì)象:</b>可以使用模型的A屬性與B屬性進(jìn)行比較
背景:在模型中有兩個(gè)字段,分別表示學(xué)生成績(jī)A與成績(jī)B鲁驶,要對(duì)成績(jī)AB進(jìn)行比較計(jì)算鉴裹,就需要使用到F對(duì)象。
例如有如下例子1:
班級(jí)中有女生個(gè)數(shù)字段以及男生個(gè)數(shù)字段钥弯,統(tǒng)計(jì)女生數(shù)大于男生數(shù)的班級(jí)可以如下操作:
grades = Grade.objects.filter(girlnum__gt=F('boynum'))
F對(duì)象支持算數(shù)運(yùn)算
grades = Grade.objects.filter(girlnum__gt=F('boynum') + 10)
例子2:
查詢python班下語(yǔ)文成績(jī)超過(guò)數(shù)學(xué)成績(jī)10分的學(xué)生
grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(s_yuwen__gt= F('s_shuxue') + 10)
<b>Q對(duì)象:</b>Q()對(duì)象就是為了將過(guò)濾條件組合起來(lái)
當(dāng)我們?cè)诓樵兊臈l件中需要組合條件時(shí)(例如兩個(gè)條件“且”或者“或”)時(shí)径荔。我們可以使用Q()查詢對(duì)象
使用符號(hào)&或者|將多個(gè)Q()對(duì)象組合起來(lái)傳遞給filter(),exclude()脆霎,get()等函數(shù)
Q()對(duì)象的前面使用字符“~”來(lái)代表意義“非”
例子1:
查詢學(xué)生中不是12歲的或者姓名叫張三的學(xué)生
student = Student.objects.filter(~Q(age=12) | Q(name='張三'))
例子2:
查詢python班語(yǔ)文小于80并且數(shù)學(xué)小于等于80的學(xué)生
grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(~Q(s_yuwen__gte=80) & Q(s_shuxue__lte=80))
例子3:
查詢python班語(yǔ)文大于等于80或者數(shù)學(xué)小于等于80的學(xué)生
grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(Q(s_yuwen__gte=80) | Q(s_shuxue__lte=80))
delete刪除字段
例:模型名.objects.filter(s_name='小草').filter().delete() :將第一個(gè)名字為小草的人刪除
update更新數(shù)據(jù)
例:模型名.objects.filter(id=1).update(s_name='大大'):將id為1的名字改為‘大大’
8.模型字段定義屬性
定義屬性
概述
·django根據(jù)屬性的類型確定以下信息
·當(dāng)前選擇的數(shù)據(jù)庫(kù)支持字段的類型
·渲染管理表單時(shí)使用的默認(rèn)html控件
·在管理站點(diǎn)最低限度的驗(yàn)證
·django會(huì)為表增加自動(dòng)增長(zhǎng)的主鍵列总处,每個(gè)模型只能有一個(gè)主鍵列,如果使用選項(xiàng)設(shè)置某屬性為主鍵列后睛蛛,則django不會(huì)再生成默認(rèn)的主鍵列
·屬性命名限制
·遵循標(biāo)識(shí)符規(guī)則(不使用python預(yù)定義的標(biāo)識(shí)符號(hào)鹦马,內(nèi)置函數(shù)名,異常等忆肾。避免使用下劃線等)
·由于django的查詢方式荸频,不允許使用連續(xù)的下劃線
庫(kù)
·定義屬性時(shí),需要字段類型客冈,字段類型被定義在django.db.models.fields目錄下旭从,為了方便使用,被導(dǎo)入到django.db.models中
·使用方式
·導(dǎo)入from django.db import models
·通過(guò)models.Field創(chuàng)建字段類型的對(duì)象郊酒,賦值給屬性
邏輯刪除
·對(duì)于重要數(shù)據(jù)都做邏輯刪除遇绞,不做物理刪除,實(shí)現(xiàn)方法是定義isDelete屬性燎窘,類型為BooleanField摹闽,默認(rèn)值為False
字段類型
·AutoField
·一個(gè)根據(jù)實(shí)際ID自動(dòng)增長(zhǎng)的IntegerField,通常不指定如果不指定褐健,一個(gè)主鍵字段將自動(dòng)添加到模型中
·CharField(max_length=字符長(zhǎng)度)
·字符串付鹿,默認(rèn)的表單樣式是 TextInput
·TextField
·大文本字段澜汤,一般超過(guò)4000使用,默認(rèn)的表單控件是Textarea
·IntegerField
·整數(shù)
·DecimalField(max_digits=None, decimal_places=None)
·使用python的Decimal實(shí)例表示的十進(jìn)制浮點(diǎn)數(shù)
·參數(shù)說(shuō)明
·DecimalField.max_digits
·位數(shù)總數(shù)
·DecimalField.decimal_places
·小數(shù)點(diǎn)后的數(shù)字位數(shù)
·FloatField
·用Python的float實(shí)例來(lái)表示的浮點(diǎn)數(shù)
·BooleanField
·true/false 字段舵匾,此字段的默認(rèn)表單控制是CheckboxInput
·NullBooleanField
·支持null俊抵、true批狱、false三種值
·DateField([auto_now=False, auto_now_add=False])
·使用Python的datetime.date實(shí)例表示的日期
·參數(shù)說(shuō)明
·DateField.auto_now
·每次保存對(duì)象時(shí)剑梳,自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間镜遣,用于"最后一次修改"的時(shí)間戳遥倦,它總是使用當(dāng)前日期,默認(rèn)為false
·DateField.auto_now_add
·當(dāng)對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間尖殃,用于創(chuàng)建的時(shí)間戳抛计,它總是使用當(dāng)前日期逮栅,默認(rèn)為false
·說(shuō)明
·該字段默認(rèn)對(duì)應(yīng)的表單控件是一個(gè)TextInput. 在管理員站點(diǎn)添加了一個(gè)JavaScript寫(xiě)的日歷控件蹋辅,和一個(gè)“Today"的快捷按鈕钱贯,包含了一個(gè)額外的invalid_date錯(cuò)誤消息鍵
·注意
·auto_now_add, auto_now, and default 這些設(shè)置是相互排斥的,他們之間的任何組合將會(huì)發(fā)生錯(cuò)誤的結(jié)果
·TimeField
·使用Python的datetime.time實(shí)例表示的時(shí)間侦另,參數(shù)同DateField
·DateTimeField
·使用Python的datetime.datetime實(shí)例表示的日期和時(shí)間秩命,參數(shù)同DateField
·FileField
·一個(gè)上傳文件的字段
·ImageField
·繼承了FileField的所有屬性和方法,但對(duì)上傳的對(duì)象進(jìn)行校驗(yàn)褒傅,確保它是個(gè)有效的image
字段選項(xiàng)
·概述
·通過(guò)字段選項(xiàng)弃锐,可以實(shí)現(xiàn)對(duì)字段的約束
·在字段對(duì)象時(shí)通過(guò)關(guān)鍵字參數(shù)指定
·null
·如果為T(mén)rue,則該字段在數(shù)據(jù)庫(kù)中是空數(shù)據(jù)樊卓,默認(rèn)值是 False
·blank
·如果為T(mén)rue拿愧,則該字段允許為空白杠河,默認(rèn)值是 False
·注意
·null是數(shù)據(jù)庫(kù)范疇的概念碌尔,blank是表單驗(yàn)證證范疇的
·db_column
·字段的名稱,如果未指定券敌,則使用屬性的名稱
·db_index
·若值為 True, 則在表中會(huì)為此字段創(chuàng)建索引
·default
·默認(rèn)值
·primary_key
·若為 True, 則該字段會(huì)成為模型的主鍵字段
·unique
·如果為 True, 這個(gè)字段在表中必須有唯一值
模型練習(xí)指南
前言
通過(guò)講mysql的系統(tǒng)唾戚,翻譯一遍,在django中通過(guò)創(chuàng)建model去和數(shù)據(jù)庫(kù)中的表進(jìn)行一一映射待诅,并且通過(guò)ORM封裝
的處理方式去練習(xí)這一到習(xí)題叹坦,并寫(xiě)出如下的解題答案
1.數(shù)據(jù)庫(kù)準(zhǔn)備
在model中定義數(shù)據(jù)庫(kù),其中的性別,男的存1卑雁,女的存0募书。
```
class Student(models.Model):
stuname = models.CharField(max_length=20)
studex = models.BooleanField()
stubirth = models.DateField()
stutel = models.CharField(max_length=255)
class Meta:
db_table = 'student'
```
2.數(shù)據(jù)庫(kù)遷移
python manage.py makemigrations
python manage.py migrate
3. 數(shù)據(jù)插入
3.1 使用表單form提交post請(qǐng)求數(shù)據(jù)
<form action="/app/addStu/" method="post">
stuname: <input type="text" name="name">
stusex: <input type="text" name="sex">
stubirth: <input type="date" name="birth">
stutel: <input type="text" name="tel">
<input type="submit" value="提交">
</form>
3.2 獲取post請(qǐng)求,獲取請(qǐng)求數(shù)據(jù)测蹲,并且創(chuàng)建數(shù)據(jù)
stu = Student()
stu.stuname = stuname
stu.stusex = sex
stu.stubirth = birth
stu.stutel = tel
stu.save()
方法2:
Student.objects.create(stuname=stuname, stusex=sex, stubirth=birth, stutel=tel)
4. 查詢所有的學(xué)生信息
使用all()方法獲取所有的數(shù)據(jù)
Student.objects.all()
4. 查詢所有女學(xué)生的姓名和出生日期
Student.objects.filter(stusex=0)
或者
Student.objects.exclude(stusex=1)
其中:
filter():返回符合條件的數(shù)據(jù)
exclude():過(guò)濾掉符合條件的數(shù)據(jù)
5.查詢所有的學(xué)生莹捡,按照id從大到小排序
Student.objects.all().order_by('-id')
其中:
order_by('id'):表示按照id升序的排列
order_by('-id'):表示按照id降序的排列
6. 查詢單個(gè)數(shù)據(jù),就不做演示了扣甲,可以使用一下的方法去獲取
get():返回一個(gè)滿足條件的對(duì)象篮赢。如果沒(méi)有返回符合條件的對(duì)象,會(huì)應(yīng)該模型類DoesNotExist異常,如果找到多個(gè)启泣,會(huì)引發(fā)模型類MultiObjectsReturned異常
first():返回查詢集中的第一個(gè)對(duì)象
last():返回查詢集中的最后一個(gè)對(duì)象
count():返回當(dāng)前查詢集中的對(duì)象個(gè)數(shù)
exists():判斷查詢集中是否有數(shù)據(jù)涣脚,如果有數(shù)據(jù)返回True,沒(méi)有返回False
7.查詢所有80后學(xué)生的姓名寥茫、性別和出生日期(篩選)
Student.objects.filter(stubirth__gte='1980-01-01', stubirth__lte='1990-01-01')
8.查詢名字中有王字的學(xué)生的姓名(模糊)
Student.objects.filter(stuname__contains='王')
9.查詢姓王的學(xué)生姓名和性別(模糊)
Student.objects.filter(stuname__startswith='王')
思考:以什么結(jié)束應(yīng)該怎么寫(xiě)----》 使用endswith
模型加餐使用指南
前言
該文檔中主要介紹模型的對(duì)應(yīng)關(guān)系遣蚀,一對(duì)一,一對(duì)多纱耻,以及多對(duì)多的關(guān)系妙同。并且舉例說(shuō)明
模型對(duì)應(yīng)關(guān)系描述如下:
1:1 一對(duì)一 OneToOneField :關(guān)聯(lián)代碼兩個(gè)模型都可以寫(xiě)
1:N 一對(duì)多 ForeignKey :關(guān)聯(lián)代碼必須寫(xiě)到多的模型中(如:一個(gè)班級(jí)有多個(gè)學(xué)生,那么關(guān)聯(lián)代碼必須寫(xiě)到班級(jí)模型中)
M:N 多對(duì)多 ManyToManyField:關(guān)聯(lián)代碼兩個(gè)模型都可以寫(xiě)膝迎,多對(duì)多遷移后django會(huì)自動(dòng)創(chuàng)建好中間表;add添加粥帚;remove刪除
常見(jiàn)的幾種數(shù)據(jù)關(guān)系,django都提供了很好的支持
1. 一對(duì)一
1.1 模型
創(chuàng)建學(xué)生的模型:
class Student(models.Model):
stu_name = models.CharField(max_length=6, unique=True)
stu_sex = models.BooleanField(default=0)
stu_birth = models.DateField()
stu_delete = models.BooleanField(default=0)
stu_create_time = models.DateField(auto_now_add=True)
stu_operate_time = models.DateField(auto_now=True)
stu_tel = models.CharField(max_length=11)
stu_yuwen = models.DecimalField(max_digits=3, decimal_places=1, default=0)
stu_shuxue = models.DecimalField(max_digits=3, decimal_places=1, default=0)
class Meta:
db_table = 'stu'
創(chuàng)建學(xué)生拓展的模型:
class StuInfo(models.Model):
stu_addr = models.CharField(max_length=30)
stu_age = models.IntegerField()
stu = models.OneToOneField(Student)
class Meta:
db_table = 'stu_info'
使用models.OneToOneField()進(jìn)行關(guān)聯(lián)
class StuInfo(models.Model):下是通過(guò)班級(jí)獲取學(xué)生信
stu = models.OneToOneField(Student)
注意:在數(shù)據(jù)中關(guān)聯(lián)字段名稱叫stu_id
1.2 通過(guò)學(xué)生拓展表去獲取學(xué)生信息
```
stuinfo = StuInfo.objects.all().first()
student = stuinfo.stu
```
注意:通過(guò)拓展表去獲取學(xué)生的信息的話限次,語(yǔ)法如下芒涡;
學(xué)生拓展表的單條對(duì)象.關(guān)聯(lián)字段,即可獲取到學(xué)生表的數(shù)據(jù)
1.3 通過(guò)學(xué)生獲取人信息1
```
stu = Student.objects.all().first()
stuInfo = stu.stuinfo
```
注意:通過(guò)學(xué)生獲取關(guān)聯(lián)表的數(shù)據(jù)的話卖漫,語(yǔ)法如下:
學(xué)生對(duì)象.關(guān)聯(lián)的表名费尽,即可獲取到關(guān)聯(lián)表的數(shù)據(jù)
1.3.1 通過(guò)學(xué)生獲取人信息2
在關(guān)聯(lián)字段OneToOneField中加入?yún)?shù)related_name='xxx'
```
在
stu = Student.objects.all().first()
stuInfo = stu.xxx
```
注意:通過(guò)學(xué)生獲取關(guān)聯(lián)表的數(shù)據(jù)的話,語(yǔ)法如下:
學(xué)生對(duì)象.關(guān)聯(lián)的字段中定義的related_name參數(shù)羊始,即可獲取到關(guān)聯(lián)表的數(shù)據(jù)
1.4 設(shè)置對(duì)應(yīng)關(guān)系的字段為保護(hù)模式 :
models.CASCADE 默認(rèn)值
models.PROTECT 保護(hù)模式
models.SET_NULL 置空模式
models.SET_DETAULT 置默認(rèn)值
models.SET() 刪除的時(shí)候吃重新動(dòng)態(tài)指向一個(gè)實(shí)體訪問(wèn)對(duì)象元素
on_delete = models.PROTECT
```
修改on_delete參數(shù)
models.OneToOneField('Student', on_delete=models.SET_NULL, null=True)
```
在刪除student對(duì)象的時(shí)候旱幼,stuinfo的關(guān)聯(lián)字段會(huì)設(shè)置為空null=True,如下命令去刪除student的數(shù)據(jù):
```
Student.objects.filter(id=1).delete()
```
1.5 定義on_delete=models.PROTECT
p = Student.objects.all().first()
p.delete()
注意:這個(gè)時(shí)候去執(zhí)行該業(yè)務(wù)邏輯的方法的時(shí)候會(huì)報(bào)錯(cuò)
2. 一對(duì)多
2.1 模型
```
定義一個(gè)班級(jí)類還有學(xué)生類突委,實(shí)現(xiàn)一對(duì)多的關(guān)系:
先定義班級(jí)類
Class Grade(models.Model):
g_name = models.CharField(max_length=16)
定義student
class Student:
s_name = models.CharField(max_length=10)
s_age = models.IntegerField(default=1)
s_grade = models.ForeignKey(Grade, on_delete=PROTECT)
```
注意:使用models.ForeignKey關(guān)聯(lián)
獲取對(duì)象元素 grade.student_set
2.2 獲取數(shù)據(jù)
語(yǔ)法:通過(guò)一獲取多的數(shù)據(jù)
公式: <b>一的對(duì)象.多的模型名小寫(xiě)_set</b>
然后在獲取數(shù)據(jù)all(), get(), filter() 等等
如下先通過(guò)學(xué)生去獲取班級(jí)信息:
stu = Student.objects.first()
stu.s_grade
如下是通過(guò)班級(jí)獲取學(xué)生信息:
g = Grade.objects.all().first()
g.stugrade.all() ---> 其中stugrade是定義的related_name參數(shù)
重點(diǎn):
定義了related_name字段以后柏卤,只能通過(guò)related_name去反向獲取數(shù)據(jù),在也不能通過(guò)_set方法去獲取數(shù)據(jù)了
2.3 數(shù)據(jù)查詢匀油,正查/反查
# 查詢id=4的學(xué)生的班級(jí)名稱
stu = Student.objects.get(id=4)
grade = stu.s_grade
# 查詢id=1的班級(jí)的所有學(xué)生
grade = Grade.objects.filter(id=1).first()
stus = grade.student_set.all()
2.4 練習(xí)題
2.6 獲取python班下的所有學(xué)生的信息
gs = Grade.objects.filter(g_name='python')[0]
allstu = gs.student_set.all()
2.7 獲取python班下語(yǔ)文成績(jī)大于80分的女學(xué)生
gs = Grade.objects.filter(g_name='python')[0]
allstu = gs.student_set.filter(stu_yuwen__gte=80)
2.8 獲取python班下語(yǔ)文成績(jī)超過(guò)數(shù)學(xué)成績(jī)10分的男學(xué)生
gs = Grade.objects.filter(g_name='python')[0]
allstu = gs.student_set.filter(stu_yuwen__gte=F('stu_shuxue') + 10)
2.9 獲取出生在80后的男學(xué)生缘缚,查看他們的班級(jí)
gs = Grade.objects.filter(g_name='python')[0]
allstu = gs.student_set.filter(stu_birth__gte='1980-01-01', stu_birth__lte='1990-01-01')
3. 多對(duì)多
3.1 M:N 模型
定義購(gòu)物車(chē),用戶的例子實(shí)現(xiàn)多對(duì)多:
```
1. 創(chuàng)建用戶模型:
class GoodsUser(models.Model):
u_name = models.CharField(max_length=32)
2. 創(chuàng)建商品模型:
class Goods(models.Model):
g_name = models.CharField(max_length=32)
g_user = models.ManyToManyField(User)
```
3.2 多對(duì)多表結(jié)構(gòu)
多對(duì)多關(guān)系:
1. 生成表的時(shí)候會(huì)多生成一張表(實(shí)際會(huì)有三張表)
2. 生成的表是專門(mén)用來(lái)維護(hù)關(guān)系的
3. 生成的表是使用兩個(gè)外鍵來(lái)維護(hù)多對(duì)多的關(guān)系
4. 兩個(gè)一對(duì)多的關(guān)系來(lái)實(shí)現(xiàn)多對(duì)多的實(shí)現(xiàn)
5. 刪除一個(gè)表的數(shù)據(jù)的話敌蚜,中間關(guān)聯(lián)表也要?jiǎng)h除相關(guān)的信息
3.3 中間表數(shù)據(jù)的增(add)刪(remove)
# id=4的用戶添加兩個(gè)商品(id=1,2)
g_user = GoodsUser.objects.get(id=4)
c1 = Goods.objects.get(id=1)
c2 = Goods.objects.get(id=2)
g_user.goods_set.add(c1)
g_user.goods_set.add(c2)
# 刪除id=4的用戶的商品中id=1的商品
g_user.goods_set.remove(c1)
3.4 練習(xí)題
3.4.1 獲取第一個(gè)用戶購(gòu)買(mǎi)了那些商品
```
gu = GoodsUser.objects.all().first()
allstu = gu.goods_set.all()
```
3.4.2 獲取指定商品的購(gòu)買(mǎi)用戶信息
```
g = Goods.objects.filter(id=1)[0]
g.g_user.all()
```
模板使用指南
前言
在Django框架中桥滨,模板是可以幫助開(kāi)發(fā)者快速生成呈現(xiàn)給用戶頁(yè)面的工具
模板的設(shè)計(jì)方式實(shí)現(xiàn)了我們MVT重VT的解耦,VT有著N:M的關(guān)系弛车,一個(gè)V可以調(diào)用任意T齐媒,一個(gè)T可以供任意V使用
模板處理分為兩個(gè)過(guò)程
加載
渲染
1. 加載靜態(tài)配置文件
在settings.py中最底下有一個(gè)叫做static的文件夾,主要用來(lái)加載一些模板中用到的資源纷跛,提供給全局使用
這個(gè)靜態(tài)文件主要用來(lái)配置css喻括,html,圖片忽舟,文字文件等
STATIC_URL = ‘/static/’
STATICFILES_DIRS = [
os.path.join(BASE_DIR, ‘static’)
]
只后在模板中双妨,首先加載靜態(tài)文件淮阐,之后調(diào)用靜態(tài),就不用寫(xiě)絕對(duì)全路徑了
2. 使用靜態(tài)配置文件
a) 加載渲染靜態(tài)配置文件
模板中聲明
{% load static %} 或者 {% load staticfiles %}
在引用資源的時(shí)候使用
{% static ‘xxx’ %} xxx就是相當(dāng)于staticfiles_dirs的一個(gè)位置
b) 直接定義靜態(tài)配置
<img src="/static/images/mvc.png">
其中: 展示static文件夾下有一個(gè)images文件夾刁品,下面有一個(gè)mvc.png的圖片
3. 模板摘要
3.1 模板主要有兩個(gè)部分
HTML靜態(tài)代碼
動(dòng)態(tài)插入的代碼段(挖坑泣特,填坑)也就是block
3.2 動(dòng)態(tài)填充
模板中的動(dòng)態(tài)代碼斷除了做基本的靜態(tài)填充,還可以實(shí)現(xiàn)一些基本的運(yùn)算挑随,轉(zhuǎn)換和邏輯
如下:
模板中的變量:
視圖傳遞給模板的數(shù)據(jù)
標(biāo)準(zhǔn)標(biāo)識(shí)符規(guī)則
語(yǔ)法 {{ var }}
如果變量不存在状您,則插入空字符串
3.3 模板重的點(diǎn)語(yǔ)法
對(duì)象.屬性或者方法
索引 (student.0.name)
3.4模板中的小弊端
調(diào)用對(duì)象的方法,不能傳遞參數(shù)
3.5 模板的標(biāo)簽
語(yǔ)法 {% tag %}
作用 a)加載外部傳入的變量
b)在輸出中創(chuàng)建文本
c)控制循環(huán)或邏輯
4. if表達(dá)式
格式1:
{% if 表達(dá)式 %}
{% endif %}
格式2:
{% if表達(dá)式 %}
{% else %}
{% endif %}
格式3:
{% if表達(dá)式 %}
{% elif 表達(dá)式 %}
{% endif %}
5. for表達(dá)式
格式1:
{% for 變量 in 列表 %}
{% empty %}
{% endfor %}
注意:當(dāng)列表為空或者不存在時(shí)兜挨,執(zhí)行empty之后的語(yǔ)句
注意一下用法:
{{ forloop.counter }} 表示當(dāng)前是第幾次循環(huán)膏孟,從1開(kāi)始
{{ forloop.counter0 }} 表示當(dāng)前從第幾次循環(huán),從0開(kāi)始
{{forloop.revcounter}}表示當(dāng)前是第幾次循環(huán)拌汇,倒著數(shù)數(shù)柒桑,到1停
{{forloop.revcounter0}}表示當(dāng)前是第幾次循環(huán),倒著數(shù)數(shù)噪舀,到0停
{{forloop.first}}是否是第一個(gè) 布爾值
{{forloop.last}}是否是最后一個(gè) 布爾值
6. 注釋
6.1 注釋可見(jiàn)魁淳,可運(yùn)行
<!-- 注釋內(nèi)容 -->
6.1 單行注釋注釋不可見(jiàn),不可運(yùn)行
單行注釋(頁(yè)面源碼中不會(huì)顯示注釋內(nèi)容)
{# 被注釋掉的內(nèi)容 #}
6.2 多行注釋注釋不可見(jiàn)与倡,不可運(yùn)行
{% comment %}
{% endcomment %}
7. 過(guò)濾器
引入過(guò)濾器定義:{{var|過(guò)濾器}}界逛, 作用:在變量顯示前修改
過(guò)濾器有很多,比如add / lower / upper
7.1 加法
{{ p.page | add:5 }}
沒(méi)有減法的過(guò)濾器纺座,但是加法里面可以加負(fù)數(shù)
{{ p.page | add: -5 }}
7.2 修改大小寫(xiě)
lower / upper : {{ p.pname | lower }} 變?yōu)樾?xiě)或者大寫(xiě)
7.3 傳參數(shù)
過(guò)濾器可以傳遞參數(shù)息拜,參數(shù)需要使用引號(hào)引起來(lái)。比如join: {{ student | join ‘=’ }}
如果值為空則設(shè)置默認(rèn)值:
默認(rèn)值:default净响,格式{{ var | default value }}
如果變量沒(méi)有被提供或者為False少欺,空,會(huì)使用默認(rèn)值
7.4 定制日期格式
根據(jù)制定格式轉(zhuǎn)換日期為字符串别惦,處理時(shí)間的就是針對(duì)date進(jìn)行的轉(zhuǎn)換
{{ dateVal | date: ‘y-m-d h:m:s’ }}
如果過(guò)濾器狈茉,定義為小寫(xiě)的y夫椭,則返回的數(shù)據(jù)為兩位的年掸掸。如果寫(xiě)的是大寫(xiě)的Y,則返回的是四位的年
定義小寫(xiě)的m蹭秋,則返回?cái)?shù)字的月份扰付,如果定義大寫(xiě)的M,則返回英文
定義小寫(xiě)的h仁讨,則返回12小時(shí)制度的時(shí)羽莺,如果定義的是大寫(xiě)的H,則返回24小時(shí)制度的時(shí)
7.5 是否轉(zhuǎn)義
HTML轉(zhuǎn)義:
將接收到的數(shù)據(jù)當(dāng)成普通字符串處理還是當(dāng)成HTML代碼來(lái)渲染的一個(gè)問(wèn)題
渲染成html: {{ code | safe }}
還可以使用autoscape渲染:
{{ autoscape off }}
{{ endautoscape }}
不渲染的話:
{{ autoscape on }}
{{ endautoscape }}
7.6 案例
<!--1. 字符串‘Python’轉(zhuǎn)化為大寫(xiě),輸出結(jié)果為:PYTHON-->
{{ 'Python'|upper }}
<!--2. 字符串‘PYTHON’轉(zhuǎn)化為小寫(xiě),輸出結(jié)果為:python-->
{{ 'PYTHON'|lower }}
<!--3. 變量3增加4,輸出結(jié)果為:7-->
{{ 3|add:'4' }}
<!--4. 第一個(gè)字符轉(zhuǎn)化成大寫(xiě)形式,輸出結(jié)果為:Python-->
{{ 'python'|capfirst }}
<!--5. 刪除指定符號(hào)的值,輸出結(jié)果為:studypythonisveryhappy -->
{{ 'study python is very happy'|cut:' ' }}
<!--6. 輸出缺省值,輸出結(jié)果為:nothing-->
{{ ''|default:'nothing' }}
<!--7. 返回第一個(gè)元素,輸出結(jié)果為:p-->
{{ 'python'|first }}
<!--8. 返回最后一個(gè)元素,輸出結(jié)果為:n-->
{{ 'python'|last }}
<!--9. 計(jì)算長(zhǎng)度,輸出結(jié)果為:6-->
{{ 'python'|length }}
<!--10. 隨機(jī)一個(gè)元素,輸出隨機(jī)結(jié)果為:y-->
{{ 'python'|random }}
7.7 django內(nèi)建過(guò)濾器大全
1洞豁、add :將value的值增加2盐固。使用形式為:{{ value | add: "2"}}荒给。
2、addslashes:在value中的引號(hào)前增加反斜線刁卜。使用形式為:{{ value | addslashes }}志电。
3、capfirst:value的第一個(gè)字符轉(zhuǎn)化成大寫(xiě)形式蛔趴。使用形式為:{{ value | capfirst }}挑辆。
4、cut:從給定value中刪除所有arg的值孝情。使用形式為:{{ value | cut:arg}}鱼蝉。
5、date: 格式化時(shí)間格式箫荡。使用形式為:{{ value | date:"Y-m-d H:M:S" }}
6魁亦、default:如果value是False,那么輸出使用缺省值羔挡。使用形式:{{ value | default: "nothing" }}吉挣。例如,如果value是“”婉弹,那么輸出將是nothing
7睬魂、default_if_none:如果value是None,那么輸出將使用缺省值镀赌。使用形式:{{ value | default_if_none:"nothing" }}氯哮,例如,如果value是None商佛,那么輸出將是nothing
8喉钢、dictsort:如果value的值是一個(gè)字典,那么返回值是按照關(guān)鍵字排序的結(jié)果
使用形式:{{ value | dictsort:"name"}}良姆,例如肠虽,
如果value是:
[{'name': 'python'},{'name': 'java'},{'name': 'c++'},]
那么,輸出是:
[{'name': 'c++'},{'name': 'java'},{'name': 'python'}, ]
9玛追、dictsortreversed:如果value的值是一個(gè)字典税课,那么返回值是按照關(guān)鍵字排序的結(jié)果的反序。使用形式:與dictsort過(guò)濾器相同痊剖。
10韩玩、divisibleby:如果value能夠被arg整除,那么返回值將是True陆馁。使用形式:{{ value | divisibleby:arg}}找颓,如果value是9,arg是3叮贩,那么輸出將是True
11击狮、escape:替換value中的某些字符佛析,以適應(yīng)HTML格式。使用形式:{{ value | escape}}彪蓬。例如说莫,< 轉(zhuǎn)化為 <> 轉(zhuǎn)化為 >' 轉(zhuǎn)化為 '" 轉(zhuǎn)化為 "
13、filesizeformat:格式化value寞焙,使其成為易讀的文件大小储狭。使用形式:{{ value | filesizeformat }}。例如:13KB捣郊,4.1MB等辽狈。
14、first:返回列表/字符串中的第一個(gè)元素呛牲。使用形式:{{ value | first }}
16刮萌、iriencode:如果value中有非ASCII字符,那么將其進(jìn)行轉(zhuǎn)化成URL中適合的編碼娘扩,如果value已經(jīng)進(jìn)行過(guò)URLENCODE着茸,改操作就不會(huì)再起作用。使用形式:{{value | iriencode}}
17琐旁、join:使用指定的字符串連接一個(gè)list涮阔,作用如同python的str.join(list)。使用形式:{{ value | join:"arg"}}灰殴,如果value是['a','b','c']敬特,arg是'//'那么輸出是a//b//c
18、last:返回列表/字符串中的最后一個(gè)元素牺陶。使用形式:{{ value | last }}
19伟阔、length:返回value的長(zhǎng)度。使用形式:{{ value | length }}
20掰伸、length_is:如果value的長(zhǎng)度等于arg的時(shí)候返回True皱炉。使用形式:{{ value | length_is:"arg"}}。例如:如果value是['a','b','c']狮鸭,arg是3合搅,那么返回True
21、linebreaks:value中的"\n"將被<br/>替代怕篷,并且整個(gè)value使用</p>包圍起來(lái)历筝。使用形式:{{value|linebreaks}}
22、linebreaksbr:value中的"\n"將被<br/>替代廊谓。使用形式:{{value |linebreaksbr}}
23、linenumbers:顯示的文本麻削,帶有行數(shù)蒸痹。使用形式:{{value | linenumbers}}
24春弥、ljust:在一個(gè)給定寬度的字段中,左對(duì)齊顯示value叠荠。使用形式:{{value | ljust}}
25匿沛、center:在一個(gè)給定寬度的字段中,中心對(duì)齊顯示value榛鼎。使用形式:{{value | center}}
26逃呼、rjust::在一個(gè)給定寬度的字段中,右對(duì)齊顯示value者娱。使用形式:{{value | rjust}}
27抡笼、lower:將一個(gè)字符串轉(zhuǎn)換成小寫(xiě)形式。使用形式:{{value | lower}}
30黄鳍、random:從給定的list中返回一個(gè)任意的Item推姻。使用形式:{{value | random}}
31、removetags:刪除value中tag1,tag2....的標(biāo)簽框沟。使用形式:{{value | removetags:"tag1 tag2 tag3..."}}
32藏古、safe:當(dāng)系統(tǒng)設(shè)置autoescaping打開(kāi)的時(shí)候,該過(guò)濾器使得輸出不進(jìn)行escape轉(zhuǎn)換忍燥。使用形式:{{value | safe}}
33拧晕、safeseq:與safe基本相同,但有一點(diǎn)不同的就是:safe是針對(duì)字符串梅垄,而safeseq是針對(duì)多個(gè)字符串組成的sequence
34防症、slice:與python語(yǔ)法中的slice相同。使用形式:{{some_list | slice:"2"}}
37哎甲、striptags:刪除value中的所有HTML標(biāo)簽.使用形式:{{value | striptags}}
38蔫敲、time:格式化時(shí)間輸出。使用形式:{{value | time:"H:i"}}或者{{value | time}}
39炭玫、title:轉(zhuǎn)換一個(gè)字符串成為title格式奈嘿。
40、truncatewords:將value切成truncatewords指定的單詞數(shù)目吞加。使用形式:{{value | truncatewords:2}}裙犹。例如,如果value是Joel is a slug 那么輸出將是:Joel is ...
42衔憨、upper:轉(zhuǎn)換一個(gè)字符串為大寫(xiě)形式
43叶圃、urlencode:將一個(gè)字符串進(jìn)行URLEncode
46、wordcount:返回字符串中單詞的數(shù)目
8. 運(yùn)算
8.1 乘
{% widthratio 數(shù) 分母 分子 %}
如下例子: 求數(shù)學(xué)成績(jī)的10倍的結(jié)果
{% widthratio 10 1 stu.stu_shuxue %}
8.2 整除
{{ num|divisibleby:2 }}
注意:該語(yǔ)句的意思是践图,判斷num值是否能被2整除掺冠,如果能的話返回True,不能的話返回False
8.3 ifeuqal判斷相等
{% ifequal value1 value2 %}
{% endifqueal %}
9. 反向解析
Url 反向解析
{% url ‘namespace:name’ p1 p2 %}
10. 跨站請(qǐng)求CSRF(Cross Site Request Forgery)
csrf攻擊說(shuō)明
1.用戶C打開(kāi)瀏覽器码党,訪問(wèn)受信任網(wǎng)站A德崭,輸入用戶名和密碼請(qǐng)求登錄網(wǎng)站A;
2.在用戶信息通過(guò)驗(yàn)證后斥黑,網(wǎng)站A產(chǎn)生Cookie信息并返回給瀏覽器,此時(shí)用戶登錄網(wǎng)站A成功眉厨,可以正常發(fā)送請(qǐng)求到網(wǎng)站A;
3.用戶未退出網(wǎng)站A之前锌奴,在同一瀏覽器中,打開(kāi)一個(gè)TAB頁(yè)訪問(wèn)網(wǎng)站B;
4.網(wǎng)站B接收到用戶請(qǐng)求后憾股,返回一些攻擊性代碼鹿蜀,并發(fā)出一個(gè)請(qǐng)求要求訪問(wèn)第三方站點(diǎn)A;
5.瀏覽器在接收到這些攻擊性代碼后,根據(jù)網(wǎng)站B的請(qǐng)求服球,在用戶不知情的情況下攜帶Cookie信息茴恰,向網(wǎng)站A發(fā)出請(qǐng)求。網(wǎng)站A并不知道該請(qǐng)求其實(shí)是由B發(fā)起的有咨,所以會(huì)根據(jù)用戶C的Cookie信息以C的權(quán)限處理該請(qǐng)求琐簇,導(dǎo)致來(lái)自網(wǎng)站B的惡意代碼被執(zhí)行。
csrf的攻擊之所以會(huì)成功是因?yàn)榉?wù)器端身份驗(yàn)證機(jī)制可以通過(guò)Cookie保證一個(gè)請(qǐng)求是來(lái)自于某個(gè)用戶的瀏覽器座享,但無(wú)法保證該請(qǐng)求是用戶允許的婉商。因此,預(yù)防csrf攻擊簡(jiǎn)單可行的方法就是在客戶端網(wǎng)頁(yè)上添加隨機(jī)數(shù)渣叛,在服務(wù)器端進(jìn)行隨機(jī)數(shù)驗(yàn)證丈秩,以確保該請(qǐng)求是用戶允許的。Django也是通過(guò)這個(gè)方法來(lái)防御csrf攻擊的淳衙。
理解如下圖:
Django中防止跨站請(qǐng)求偽造使用CSRF, 即:客戶端訪問(wèn)服務(wù)器端蘑秽,在服務(wù)器端正常返回給客戶端數(shù)據(jù)的時(shí)候,而外返回給客戶端一段字符串箫攀,等到客戶端下次訪問(wèn)服務(wù)器
端時(shí)肠牲,服務(wù)器端會(huì)到客戶端查找先前返回的字符串,如果找到則繼續(xù)靴跛,找不到就拒絕缀雳。
Django中配置:
- 在表單中添加
{% csrf_token %} - 在settings中的中間件MIDDLEWARE中配置打開(kāi)
‘django.middleware.csrf.CsrfViewMiddleware’
11. 模板繼承
11.1 block挖坑不用看了
關(guān)鍵字 block挖坑
{% block xxx %}
{% endblock %}
11.2 extends
extends 繼承,寫(xiě)在開(kāi)頭位置
{% extends ‘父模板路徑’%}
11.3 include
include 加載模型進(jìn)行渲染
{% include ‘模板文件’%}
12. 模板繼承實(shí)戰(zhàn)
12.1 定義基礎(chǔ)模板base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
{% block title %}
{% endblock %}
</title>
{% block extCSS %}
{% endblock %}
{% block extJS %}
{% endblock %}
</head>
{% block indexbody %}
{% endblock %}
<body>
{% block content %}
{% endblock %}
{% block footer %}
{% endblock %}
</body>
</html>
12.2 定義繼承base.html的base_main.html模板
該base_main.html模板主要用于加載一些公共的js或者css梢睛,其余模板繼承該模板后肥印,可以直接加載定義好的公共的js或者css
{% extends 'base.html' %}
{% block extJS %}
<script type="text/javascript" src="/static/js/jquery.min.js"></script>
{% endblock %}
12.3 定義首頁(yè)index.html
在首頁(yè)index.html中,我們?cè)趝% block extJS %}中使用{{ block.super }}去加載之前在base_main.html中定義好了的js文件绝葡,將它繼承過(guò)來(lái)深碱,那么在index.html中就會(huì)加載兩個(gè)js文件了。實(shí)現(xiàn)了將公共的js文件或者css文件單獨(dú)提煉出去藏畅,不需要再每個(gè)頁(yè)面中重復(fù)的去寫(xiě)加載js的重復(fù)代碼了敷硅。
{% extends 'base_main.html' %}
{% block title %}
首頁(yè){{ user.username }}
{% endblock %}
{% block extCSS %}
<link rel="stylesheet" type="text/css" href="/static/css/public.css" />
{% endblock %}
{% block extJS %}
{{ block.super }}
<script type="text/javascript" src="/static/js/public.js"></script>
{% endblock %}
{% block indexbody %}
<frameset rows="100,*" cols="*" scrolling="No" framespacing="0"
frameborder="no" border="0">
<frame src="{% url 'app:head' %}" name="headmenu" id="mainFrame" title="mainFrame"><!-- 引用頭部 -->
<!-- 引用左邊和主體部分 -->
<frameset rows="100*" cols="220,*" scrolling="No"
framespacing="0" frameborder="no" border="0">
<frame src="{% url 'app:left' %}" name="leftmenu" id="mainFrame" title="mainFrame">
<frame src="{% url 'app:grade' %}" name="main" scrolling="yes" noresize="noresize"
id="rightFrame" title="rightFrame">
</frameset>
</frameset>
{% endblock %}