Django详解
Django
一個(gè)公司是由公司中的各部部門(mén)來(lái)組成的,每一個(gè)部門(mén)擁有特定的職能,部門(mén)與部門(mén)之間通過(guò)相互的配合來(lái)完成讓公司運(yùn)轉(zhuǎn)起來(lái)。
一個(gè)軟件框架是由其中各個(gè)軟件模塊組成的,每一個(gè)模塊都有特定的功能,模塊與模塊之間通過(guò)相互配合來(lái)完成軟件的開(kāi)發(fā)。
軟件框架是針對(duì)某一類(lèi)軟件設(shè)計(jì)問(wèn)題而產(chǎn)生的。
2. MVC框架
2.1 MVC簡(jiǎn)介
MVC最初是由施樂(lè)公司旗下的帕羅奧多研究中心中的一位研究人員給 smalltalk語(yǔ)言發(fā)明的一中軟件設(shè)計(jì)模式。
MVC的產(chǎn)生理念: 分工。讓專(zhuān)門(mén)的人去做專(zhuān)門(mén)的事。
MVC的核心思想: 解耦。
2.2 Web MVC框架模塊功能
通過(guò)瀏覽器注冊(cè)用戶信息。
M:Model,模型, 和數(shù)據(jù)庫(kù)進(jìn)行交互。
V:View,視圖, 產(chǎn)生html頁(yè)面。
C:Controller,控制器, 接收請(qǐng)求,進(jìn)行處理,與M和V進(jìn)行交互,返回應(yīng)答。
3. Django框架
3.1 簡(jiǎn)介
Django是勞倫斯出版集團(tuán)的開(kāi)發(fā)人員為開(kāi)發(fā)新聞內(nèi)容網(wǎng)站而設(shè)計(jì)出來(lái)的一個(gè)軟件,它遵循MVC思想,但是有自己的一個(gè)名詞,叫做MVT。
Django遵循快速開(kāi)發(fā)和DRY原則。Do not repeat yourself.不要自己去重復(fù)一些工作。
3.2 MVT各部分功能
M:Model,模型, 和MVC中M功能相同,和數(shù)據(jù)庫(kù)進(jìn)行交互。
V:View,視圖, 和MVC中C功能相同,接收請(qǐng)求,進(jìn)行處理,與M和T進(jìn)行交互,返回應(yīng)答。
T:Template,模板, 和MVC中V功能相同,產(chǎn)生html頁(yè)面。
4. 虛擬環(huán)境
4.1 概念
之前安裝python包的命令: sudo pip3 install 包名
包的安裝路徑:/usr/local/lib/python3.5/dist-packages
在同一個(gè)python環(huán)境中安裝同一個(gè)包的不同版本,后安裝的包會(huì)把原來(lái)安裝的包覆蓋掉。這樣,如果同一臺(tái)機(jī)器上兩個(gè)項(xiàng)目依賴(lài)于相同包的不同版本,則會(huì)導(dǎo)致一些項(xiàng)目運(yùn)行失敗。
解決的方案就是:虛擬環(huán)境。
虛擬環(huán)境是真實(shí)python環(huán)境的復(fù)制版本。
在虛擬環(huán)境中使用的python是復(fù)制的python,安裝python包也是安裝在復(fù)制的python中。
4.2 安裝和配置
安裝虛擬環(huán)境的命令:
1)sudo pip install virtualenv #安裝虛擬環(huán)境
2)sudo pip install virtualenvwrapper #安裝虛擬環(huán)境擴(kuò)展包
3)編輯家目錄下面的.bashrc文件,添加下面兩行。
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
4)使用source .bashrc使其生效一下。
4.3 使用
創(chuàng)建虛擬環(huán)境命令:
mkvirtualenv 虛擬環(huán)境名
創(chuàng)建python3虛擬環(huán)境:
mkvirtualenv -p python3 bj11_py3
進(jìn)入虛擬環(huán)境工作:
workon 虛擬環(huán)境名
查看機(jī)器上有多少個(gè)虛擬環(huán)境:
workon 空格 + 兩個(gè)tab鍵
退出虛擬環(huán)境:
deactivate
刪除虛擬環(huán)境:
rmvirtualenv 虛擬環(huán)境名
虛擬環(huán)境下安裝包的命令:
pip install 包名
注意:不能使用sudo pip install 包名,這個(gè)命令會(huì)把包安裝到真實(shí)的主機(jī)環(huán)境上而不是安裝到虛擬環(huán)境中。
查看虛擬環(huán)境中安裝了哪些python包:
pip list
pip freeze
安裝django環(huán)境:
pip install django==1.8.2
拓展:
apt-get install 軟件
pip install python包名
5. 項(xiàng)目創(chuàng)建
5.1 創(chuàng)建Django項(xiàng)目
命令:django-admin startproject 項(xiàng)目名
注意:創(chuàng)建應(yīng)用必須先進(jìn)入虛擬環(huán)境。
項(xiàng)目目錄如下:
init.py: 說(shuō)明test1是一個(gè)python包。
settings.py: 項(xiàng)目的配置文件。
urls.py: 進(jìn)行url路由的配置。
wsgi.py: web服務(wù)器和Django交互的入口。
manage.py: 項(xiàng)目的管理文件。
5.2 創(chuàng)建Django應(yīng)用
一個(gè)項(xiàng)目由很多個(gè)應(yīng)用組成的,每一個(gè)應(yīng)用完成一個(gè)功能模塊。
創(chuàng)建應(yīng)用的命令如下:
python manage.py startapp 應(yīng)用名
注意:創(chuàng)建應(yīng)用時(shí)需要先進(jìn)入項(xiàng)目目錄。
應(yīng)用目錄如下:
init.py: 說(shuō)明目錄是一個(gè)Python模塊。
models.py: 寫(xiě)和數(shù)據(jù)庫(kù)項(xiàng)目的內(nèi)容, 設(shè)計(jì)模型類(lèi)。
views.py: ,接收請(qǐng)求,進(jìn)行處理,與M和T進(jìn)行交互,返回應(yīng)答。
定義處理函數(shù),視圖函數(shù)。
tests.py: 寫(xiě)測(cè)試代碼的文件。
admin.py: 網(wǎng)站后臺(tái)管理相關(guān)的文件。
5.3 應(yīng)用注冊(cè)
建立應(yīng)用和項(xiàng)目之間的聯(lián)系,需要對(duì)應(yīng)用進(jìn)行注冊(cè)。
修改settings.py中的INSTALLED_APPS配置項(xiàng)。
5.4 啟動(dòng)項(xiàng)目
運(yùn)行開(kāi)發(fā)web服務(wù)器命令:
python manage.py runserver
6. 模型類(lèi)
6.1 ORM
django中內(nèi)嵌了ORM框架,ORM框架可以將類(lèi)和數(shù)據(jù)表進(jìn)行對(duì)應(yīng)起來(lái),只需要通過(guò)類(lèi)和對(duì)象就可以對(duì)數(shù)據(jù)表進(jìn)行操作。
在Django中主要是設(shè)計(jì)類(lèi):模型類(lèi)。
ORM另外一個(gè)作用:根據(jù)設(shè)計(jì)的類(lèi)生成數(shù)據(jù)庫(kù)中的表。
6.2 模型類(lèi)設(shè)計(jì)
在應(yīng)用models.py中設(shè)計(jì)模型類(lèi)。
必須繼承與models.Model類(lèi)。
1) 設(shè)計(jì)BookInfo類(lèi)。
2) 設(shè)計(jì)HeroInfo類(lèi)。
Models.ForeignKey可以建立兩個(gè)模型類(lèi)之間一對(duì)多的關(guān)系,django在生成表的時(shí)候,就會(huì)在多端的表中創(chuàng)建一列作為外鍵,建立兩個(gè)表之間一對(duì)多的關(guān)系。
6.3 模型類(lèi)生成表
命令:python manage.py makemigrations
遷移文件是根據(jù)模型類(lèi)生成的。
2) 執(zhí)行遷移生成表
命令:python mange.py migrate
根據(jù)遷移文件生成表。
生成表名的默認(rèn)格式:
應(yīng)用名_模型類(lèi)名小寫(xiě)
6.4 通過(guò)模型類(lèi)操作數(shù)據(jù)表
進(jìn)入項(xiàng)目shell的命令:
python manage.py shell
以下為在相互shell終端中演示的例子:
首先導(dǎo)入模型類(lèi):
from booktest.models import BookInfo,HeroInfo
b = BookInfo() #定義一個(gè)BookInfo類(lèi)的對(duì)象
b.btitle =‘天龍八部’ #定義b對(duì)象的屬性并賦值
b.bpub_date = date(1990,10,11)
b.save() #才會(huì)將數(shù)據(jù)保存進(jìn)數(shù)據(jù)庫(kù)
b = BookInfo.objects.get(id=1)
b.bpub_date = date(1989,10,21)
b.save() #才會(huì)更新表格中的數(shù)據(jù)
b.delete() #才會(huì)刪除
h = HeroInfo()
h.hname = ‘郭靖’
h.hgender = False
h.hcomment = ‘降龍十八掌’
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #給關(guān)系屬性賦值,英雄對(duì)象所屬的圖書(shū)對(duì)象
h.save()
BookInfo.objects.all()
HeroInfo.objects.all()
6.5 關(guān)聯(lián)操作
b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() #查詢(xún)出b圖書(shū)中所有英雄人物的信息
語(yǔ)言和時(shí)區(qū)的本地化。
修改settings.py文件。
命令:python manage.py createsuperuser
在應(yīng)用下的admin.py中注冊(cè)模型類(lèi)。
告訴djang框架根據(jù)注冊(cè)的模型類(lèi)來(lái)生成對(duì)應(yīng)表管理頁(yè)面。
b = BookInfo()
str(b) str
自定義模型管理類(lèi)。模型管理類(lèi)就是告訴django在生成的管理頁(yè)面上顯示哪些內(nèi)容。
在Django中,通過(guò)瀏覽器去請(qǐng)求一個(gè)頁(yè)面時(shí),使用視圖函數(shù)來(lái)處理這個(gè)請(qǐng)求的,視圖函數(shù)處理之后,要給瀏覽器返回頁(yè)面內(nèi)容。
8.1視圖函數(shù)的使用
定義視圖函數(shù)
視圖函數(shù)定義在views.py中。
例:
def index(request):
#進(jìn)行處理。。。
return HttpResponse(‘hello python’)
視圖函數(shù)必須有一個(gè)參數(shù)request,進(jìn)行處理之后,需要返回一個(gè)HttpResponse的類(lèi)對(duì)象,hello python就是返回給瀏覽器顯示的內(nèi)容。
進(jìn)行url配置
url配置的目的是讓建立url和視圖函數(shù)的對(duì)應(yīng)關(guān)系。url配置項(xiàng)定義在urlpatterns的列表中,每一個(gè)配置項(xiàng)都調(diào)用url函數(shù)。
url函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)正則表達(dá)式,第二個(gè)是對(duì)應(yīng)的處理動(dòng)作。
配置url時(shí),有兩種語(yǔ)法格式:
a) url(正則表達(dá)式,視圖函數(shù)名)
b) url(正則表達(dá)式,include(應(yīng)用中的urls文件))
工作中在配置url時(shí),首先在項(xiàng)目的urls.py文件中添加配置項(xiàng)時(shí),并不寫(xiě)具體的url和視圖函數(shù)之間的對(duì)應(yīng)關(guān)系,而是包含具體應(yīng)用的urls.py文件,在應(yīng)用的urls.py文件中寫(xiě)url和視圖函數(shù)的對(duì)應(yīng)關(guān)系。
8.2 url匹配的過(guò)程
在項(xiàng)目的urls.py文件中包含具體應(yīng)用的urls.py文件,應(yīng)用的urls.py文件中寫(xiě)url和視圖函數(shù)的對(duì)應(yīng)關(guān)系。
當(dāng)用戶輸入如http://127.0.0.1:8000/aindex時(shí),去除域名和最前面的/,剩下aindex,拿aindex字符串到項(xiàng)目的urls文件中進(jìn)行匹配,配置成功之后,去除匹配的a字符,那剩下的index字符串繼續(xù)到應(yīng)用的urls文件中進(jìn)行正則匹配,匹配成功之后執(zhí)行視圖函數(shù)index,index視圖函數(shù)返回內(nèi)容hello python給瀏覽器來(lái)顯示。
9. 模板
模板不僅僅是一個(gè)html文件。
9.1 模板文件的使用
a) 加載模板文件
去模板目錄下面獲取html文件的內(nèi)容,得到一個(gè)模板對(duì)象。
b) 定義模板上下文
向模板文件傳遞數(shù)據(jù)。
c) 模板渲染
得到一個(gè)標(biāo)準(zhǔn)的html內(nèi)容。
9.2 給模板文件傳遞數(shù)據(jù)
模板變量使用:{{ 模板變量名 }}
模板代碼段:{%代碼段%}
for循環(huán):
{% for i in list %}
list不為空時(shí)執(zhí)行的邏輯
{% empty %}
list為空時(shí)執(zhí)行的邏輯
{% endfor %}
編碼之前的準(zhǔn)備工作:
以下為案例中的簡(jiǎn)單設(shè)計(jì)過(guò)程:
a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/books 時(shí)顯示圖書(shū)信息頁(yè)面。
b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)show_books。
查詢(xún)出所有圖書(shū)的信息,將這些信息傳遞給模板文件。
c) 編寫(xiě)模板文件show_books.html。
遍歷顯示出每一本圖書(shū)的信息。
a) 設(shè)計(jì)url,通過(guò)訪問(wèn)http://127.0.0.1:8000/books/數(shù)字時(shí)顯示對(duì)應(yīng)的英雄信息頁(yè)面。
這里數(shù)字指點(diǎn)擊的圖書(shū)的id。
b) 設(shè)計(jì)對(duì)應(yīng)的視圖函數(shù)detail。
接收?qǐng)D書(shū)的id,根據(jù)id查詢(xún)出相應(yīng)的圖書(shū)信息,然后查詢(xún)出圖書(shū)中的所有英雄信息。
c) 編寫(xiě)模板文件detail.html。
模型
O(objects):類(lèi)和對(duì)象。
R(Relation):關(guān)系,關(guān)系數(shù)據(jù)庫(kù)中的表格。
M(Mapping):映射。
Django ORM框架的功能:
a) 建立模型類(lèi)和表之間的對(duì)應(yīng)關(guān)系,允許我們通過(guò)面向?qū)ο蟮姆绞絹?lái)操作數(shù)據(jù)庫(kù)。
b) 根據(jù)設(shè)計(jì)的模型類(lèi)生成數(shù)據(jù)庫(kù)中的表格。
c) 通過(guò)方便的配置就可以進(jìn)行數(shù)據(jù)庫(kù)的切換。
2. Django數(shù)據(jù)庫(kù)配置
2.1 mysql命令回顧
登錄mysql數(shù)據(jù)庫(kù):mysql –uroot –p
查看有哪些數(shù)據(jù)庫(kù):show databases
創(chuàng)建數(shù)據(jù)庫(kù):create database test2 charset=utf8; #切記:指定編碼
使用數(shù)據(jù)庫(kù):use test2;
查看數(shù)據(jù)庫(kù)中的表:show tables;
2.2 Django配置使用mysql數(shù)據(jù)庫(kù)
修改settings.py中的DATABASES。
注意:django框架不會(huì)自動(dòng)幫我們生成mysql數(shù)據(jù)庫(kù),所以我們需要自己去創(chuàng)建。
2.3 切換mysql數(shù)據(jù)庫(kù)之后不能啟動(dòng)服務(wù)器
需要安裝操作mysql數(shù)據(jù)庫(kù)的包,python2環(huán)境和python3環(huán)境有以下區(qū)別。
a) python2需要安裝mysql-python:
pip install mysql-python
b) python3需要安裝pymysql:
pip install pymysql
python3中安裝好pymysql,需要在test2/init.py中加如下內(nèi)容:
import pymysql
pymysql.install_as_MySQLdb()
3. 復(fù)習(xí)案例
a) 設(shè)計(jì)BookInfo,增加屬性bread和bcomment,另外設(shè)置軟刪除標(biāo)記屬性isDelete。
b) 設(shè)計(jì)HeroInfo類(lèi),增加軟刪除標(biāo)記屬性isDelete。
軟刪除標(biāo)記:刪除數(shù)據(jù)時(shí)不做真正的刪除,而是把標(biāo)記數(shù)據(jù)設(shè)置為1表示刪除,目的是防止重要的數(shù)據(jù)丟失。
3)創(chuàng)建模板文件。
拆解功能:
a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/index時(shí)顯示圖書(shū)信息頁(yè)面。
b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)index。
查詢(xún)出所有圖書(shū)的信息,將這些信息傳遞給模板文件。
c) 編寫(xiě)模板文件index.html。
遍歷顯示出每一本圖書(shū)的信息并增加新建和刪除超鏈接。
2)圖書(shū)信息新增。
a)設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/create時(shí)向數(shù)據(jù)庫(kù)中新增一條圖書(shū)信息。
b) 設(shè)計(jì)url對(duì)應(yīng)得視圖函數(shù)create。
頁(yè)面重定向:服務(wù)器不返回頁(yè)面,而是告訴瀏覽器再去請(qǐng)求其他的url地址。
3)圖書(shū)信息刪除。
a)設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/delete數(shù)字刪除數(shù)據(jù)庫(kù)中對(duì)應(yīng)的一條圖書(shū)數(shù)據(jù)。
其中數(shù)字是點(diǎn)擊的圖書(shū)的id。
b)設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)delete。
獲取圖書(shū)的id,進(jìn)行刪除。
4. 字段屬性和選項(xiàng)
4.1 模型類(lèi)屬性命名限制
1)不能是python的保留關(guān)鍵字。
2)不允許使用連續(xù)的下劃線,這是由django的查詢(xún)方式?jīng)Q定的。
3)定義屬性時(shí)需要指定字段類(lèi)型,通過(guò)字段類(lèi)型的參數(shù)指定選項(xiàng),語(yǔ)法如下:
屬性名=models.字段類(lèi)型(選項(xiàng))
4.2 字段類(lèi)型
使用時(shí)需要引入django.db.models包,字段類(lèi)型如下:
類(lèi)型 描述
AutoField 自動(dòng)增長(zhǎng)的IntegerField,通常不用指定,不指定時(shí)Django會(huì)自動(dòng)創(chuàng)建屬性名為id的自動(dòng)增長(zhǎng)屬性。
BooleanField 布爾字段,值為T(mén)rue或False。
NullBooleanField 支持Null、True、False三種值。
CharField(max_length=最大長(zhǎng)度) 字符串。參數(shù)max_length表示最大字符個(gè)數(shù)。
TextField 大文本字段,一般超過(guò)4000個(gè)字符時(shí)使用。
IntegerField 整數(shù)
DecimalField(max_digits=None, decimal_places=None) 十進(jìn)制浮點(diǎn)數(shù)。參數(shù)max_digits表示總位。參數(shù)decimal_places表示小數(shù)位數(shù)。
FloatField 浮點(diǎn)數(shù)。參數(shù)同上
DateField:([auto_now=False, auto_now_add=False]) 日期。
1)參數(shù)auto_now表示每次保存對(duì)象時(shí),自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間,用于"最后一次修改"的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為false。
2) 參數(shù)auto_now_add表示當(dāng)對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間,用于創(chuàng)建的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為false。
3)參數(shù)auto_now_add和auto_now是相互排斥的,組合將會(huì)發(fā)生錯(cuò)誤。
TimeField 時(shí)間,參數(shù)同DateField。
DateTimeField 日期時(shí)間,參數(shù)同DateField。
FileField 上傳文件字段。
ImageField 繼承于FileField,對(duì)上傳的內(nèi)容進(jìn)行校驗(yàn),確保是有效的圖片。
4.3 選項(xiàng)
通過(guò)選項(xiàng)實(shí)現(xiàn)對(duì)字段的約束,選項(xiàng)如下:
選項(xiàng)名 描述
default 默認(rèn)值。設(shè)置默認(rèn)值。
primary_key 若為T(mén)rue,則該字段會(huì)成為模型的主鍵字段,默認(rèn)值是False,一般作為AutoField的選項(xiàng)使用。
unique 如果為T(mén)rue, 這個(gè)字段在表中必須有唯一值,默認(rèn)值是False。
db_index 若值為T(mén)rue, 則在表中會(huì)為此字段創(chuàng)建索引,默認(rèn)值是False。
db_column 字段的名稱(chēng),如果未指定,則使用屬性的名稱(chēng)。
null 如果為T(mén)rue,表示允許為空,默認(rèn)值是False。
blank 如果為T(mén)rue,則該字段允許為空白,默認(rèn)值是False。
對(duì)比:null是數(shù)據(jù)庫(kù)范疇的概念,blank是后臺(tái)管理頁(yè)面表單驗(yàn)證范疇的。
經(jīng)驗(yàn):
當(dāng)修改模型類(lèi)之后,如果添加的選項(xiàng)不影響表的結(jié)構(gòu),則不需要重新做遷移,商品的選項(xiàng)中default和blank不影響表結(jié)構(gòu)。
參考文檔:
http://python.usyiyi.cn/translate/django_182/index.html
5. 查詢(xún)
5.1 mysql的日志文件
mysql.log是mysql的日志文件,里面記錄的對(duì)MySQL數(shù)據(jù)庫(kù)的操作記錄。默認(rèn)情況下mysql的日志文件沒(méi)有產(chǎn)生,需要修改mysql的配置文件,步驟如下:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2)重啟mysql服務(wù),就會(huì)產(chǎn)生mysql日志文件。
sudo service mysql restart
3)打開(kāi)MySQL的日志文件。
/var/log/mysql/mysql.log 是mysql日志文件所在的位置。
使用下面的命令可以實(shí)時(shí)查看mysql的日志文件:
sudo tail -f /var/log/mysql/mysql.log
5.2 查詢(xún)函數(shù)
通過(guò)模型類(lèi).objects屬性可以調(diào)用如下函數(shù),實(shí)現(xiàn)對(duì)模型類(lèi)對(duì)應(yīng)的數(shù)據(jù)表的查詢(xún)。
函數(shù)名 功能 返回值 說(shuō)明
get 返回表中滿足條件的一條且只能有一條數(shù)據(jù)。 返回值是一個(gè)模型類(lèi)對(duì)象。 參數(shù)中寫(xiě)查詢(xún)條件。
2)查詢(xún)不到數(shù)據(jù),則拋異常:DoesNotExist。
all 返回模型類(lèi)對(duì)應(yīng)表格中的所有數(shù)據(jù)。 返回值是QuerySet類(lèi)型 查詢(xún)集
filter 返回滿足條件的數(shù)據(jù)。 返回值是QuerySet類(lèi)型 參數(shù)寫(xiě)查詢(xún)條件。
exclude 返回不滿足條件的數(shù)據(jù)。 返回值是QuerySet類(lèi)型 參數(shù)寫(xiě)查詢(xún)條件。
order_by 對(duì)查詢(xún)結(jié)果進(jìn)行排序。 返回值是QuerySet類(lèi)型 參數(shù)中寫(xiě)根據(jù)哪些字段進(jìn)行排序。
get示例:
例:查詢(xún)圖書(shū)id為3的圖書(shū)信息。
all方法示例:
例:查詢(xún)圖書(shū)所有信息。
filter方法示例:
條件格式:
模型類(lèi)屬性名__條件名=值
查詢(xún)圖書(shū)評(píng)論量為34的圖書(shū)的信息:
a)判等 條件名:exact。
例:查詢(xún)編號(hào)為1的圖書(shū)。
BookInfo.objects.get(id=1)
b)模糊查詢(xún)
例:查詢(xún)書(shū)名包含’傳’的圖書(shū)。contains
BookInfo.objects.filter(btitle__contains=‘傳’)
例:查詢(xún)書(shū)名以’部’結(jié)尾的圖書(shū) endswith 開(kāi)頭:startswith
BookInfo.objects.filter(btitle__endswith=‘部’)
c)空查詢(xún) isnull
例:查詢(xún)書(shū)名不為空的圖書(shū)。isnull
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)
d)范圍查詢(xún) in
例:查詢(xún)id為1或3或5的圖書(shū)。
select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])
e)比較查詢(xún) gt(greate than) lt(less than) gte(equal) 大于等于
lte 小于等于
例:查詢(xún)id大于3的圖書(shū)。
Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)
f)日期查詢(xún)
例:查詢(xún)1980年發(fā)表的圖書(shū)。
BookInfo.objects.filter(bpub_date__year=1980)
例:查詢(xún)1980年1月1日后發(fā)表的圖書(shū)。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查詢(xún)id不為3的圖書(shū)信息。
BookInfo.objects.exclude(id=3)
order_by方法示例:
作用:進(jìn)行查詢(xún)結(jié)果進(jìn)行排序。
例:查詢(xún)所有圖書(shū)的信息,按照id從小到大進(jìn)行排序。
BookInfo.objects.all().order_by(‘id’)
例:查詢(xún)所有圖書(shū)的信息,按照id從大到小進(jìn)行排序。
BookInfo.objects.all().order_by(’-id’)
例:把id大于3的圖書(shū)信息按閱讀量從大到小排序顯示。
BookInfo.objects.filter(id__gt=3).order_by(’-bread’)
作用:用于類(lèi)屬性之間的比較。
使用之前需要先導(dǎo)入:
from django.db.models import F
例:查詢(xún)圖書(shū)閱讀量大于評(píng)論量圖書(shū)信息。
BookInfo.objects.filter(bread__gt=F(‘bcomment’))
例:查詢(xún)圖書(shū)閱讀量大于2倍評(píng)論量圖書(shū)信息。
BookInfo.objects.filter(bread__gt=F(‘bcomment’)*2)
作用:用于查詢(xún)時(shí)條件之間的邏輯關(guān)系。not and or,可以對(duì)Q對(duì)象進(jìn)行&|~操作。
使用之前需要先導(dǎo)入:
from django.db.models import Q
例:查詢(xún)id大于3且閱讀量大于30的圖書(shū)的信息。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
例:查詢(xún)id大于3或者閱讀量大于30的圖書(shū)的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
例:查詢(xún)id不等于3圖書(shū)的信息。
BookInfo.objects.filter(~Q(id=3))
作用:對(duì)查詢(xún)結(jié)果進(jìn)行聚合操作。
sum count avg max min
aggregate:調(diào)用這個(gè)函數(shù)來(lái)使用聚合。 返回值是一個(gè)字典
使用前需先導(dǎo)入聚合類(lèi):
from django.db.models import Sum,Count,Max,Min,Avg
例:查詢(xún)所有圖書(shū)的數(shù)目。
BookInfo.objects.all().aggregate(Count(‘id’))
{‘id__count’: 5}
例:查詢(xún)所有圖書(shū)閱讀量的總和。
BookInfo.objects.aggregate(Sum(‘bread’))
{‘bread__sum’: 126}
count函數(shù) 返回值是一個(gè)數(shù)字
作用:統(tǒng)計(jì)滿足條件數(shù)據(jù)的數(shù)目。
例:統(tǒng)計(jì)所有圖書(shū)的數(shù)目。
BookInfo.objects.all().count()
BookInfo.objects.count()
例:統(tǒng)計(jì)id大于3的所有圖書(shū)的數(shù)目。
BookInfo.objects.filter(id__gt=3).count()
小結(jié):
參考文檔:
http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html
9. 查詢(xún)集
all, filter, exclude, order_by調(diào)用這些函數(shù)會(huì)產(chǎn)生一個(gè)查詢(xún)集,QuerySet類(lèi)對(duì)象可以繼續(xù)調(diào)用上面的所有函數(shù)。
9.1 查詢(xún)集特性
1) 惰性查詢(xún):只有在實(shí)際使用查詢(xún)集中的數(shù)據(jù)的時(shí)候才會(huì)發(fā)生對(duì)數(shù)據(jù)庫(kù)的真正查詢(xún)。
2) 緩存:當(dāng)使用的是同一個(gè)查詢(xún)集時(shí),第一次使用的時(shí)候會(huì)發(fā)生實(shí)際數(shù)據(jù)庫(kù)的查詢(xún),然后把結(jié)果緩存起來(lái),之后再使用這個(gè)查詢(xún)集時(shí),使用的是緩存中的結(jié)果。
9.2 限制查詢(xún)集
可以對(duì)一個(gè)查詢(xún)集進(jìn)行取下標(biāo)或者切片操作來(lái)限制查詢(xún)集的結(jié)果。
對(duì)一個(gè)查詢(xún)集進(jìn)行切片操作會(huì)產(chǎn)生一個(gè)新的查詢(xún)集,下標(biāo)不允許為負(fù)數(shù)。
取出查詢(xún)集第一條數(shù)據(jù)的兩種方式:
方式 說(shuō)明
b[0] 如果b[0]不存在,會(huì)拋出IndexError異常
b[0:1].get() 如果b[0:1].get()不存在,會(huì)拋出DoesNotExist異常。
exists:判斷一個(gè)查詢(xún)集中是否有數(shù)據(jù)。True False
10. 模型類(lèi)關(guān)系
1) 一對(duì)多關(guān)系
例:圖書(shū)類(lèi)-英雄類(lèi)
models.ForeignKey() 定義在多的類(lèi)中。
2) 多對(duì)多關(guān)系
例:新聞?lì)?新聞?lì)愋皖?lèi) 體育新聞 國(guó)際新聞
models.ManyToManyField() 定義在哪個(gè)類(lèi)中都可以。
3) 一對(duì)一關(guān)系
例:員工基本信息類(lèi)-員工詳細(xì)信息類(lèi). 員工工號(hào)
models.OneToOneField定義在哪個(gè)類(lèi)中都可以。
11. 關(guān)聯(lián)查詢(xún)(一對(duì)多)
11.1 查詢(xún)和對(duì)象關(guān)聯(lián)的數(shù)據(jù)
在一對(duì)多關(guān)系中,一對(duì)應(yīng)的類(lèi)我們把它叫做一類(lèi),多對(duì)應(yīng)的那個(gè)類(lèi)我們把它叫做多類(lèi),我們把多類(lèi)中定義的建立關(guān)聯(lián)的類(lèi)屬性叫做關(guān)聯(lián)屬性。
例:查詢(xún)id為1的圖書(shū)關(guān)聯(lián)的英雄的信息。
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
通過(guò)模型類(lèi)查詢(xún):
HeroInfo.objects.filter(hbook__id=1)
例:查詢(xún)id為1的英雄關(guān)聯(lián)的圖書(shū)信息。
h = HeroInfo.objects.get(id=1)
h.hbook
通過(guò)模型類(lèi)查詢(xún):
BookInfo.objects.filter(heroinfo__id=1)
格式:
由一類(lèi)的對(duì)象查詢(xún)多類(lèi)的時(shí)候:
一類(lèi)的對(duì)象.多類(lèi)名小寫(xiě)_set.all() #查詢(xún)所用數(shù)據(jù)
由多類(lèi)的對(duì)象查詢(xún)一類(lèi)的時(shí)候:
多類(lèi)的對(duì)象.關(guān)聯(lián)屬性 #查詢(xún)多類(lèi)的對(duì)象對(duì)應(yīng)的一類(lèi)的對(duì)象
由多類(lèi)的對(duì)象查詢(xún)一類(lèi)對(duì)象的id時(shí)候:
多類(lèi)的對(duì)象. 關(guān)聯(lián)屬性_id
11.2 通過(guò)模型類(lèi)實(shí)現(xiàn)關(guān)聯(lián)查詢(xún)
例:查詢(xún)圖書(shū)信息,要求圖書(shū)關(guān)聯(lián)的英雄的描述包含’八’。
BookInfo.objects.filter(heroinfo__hcomment__contains=‘八’)
例:查詢(xún)圖書(shū)信息,要求圖書(shū)中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查詢(xún)書(shū)名為“天龍八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle=‘天龍八部’)
通過(guò)多類(lèi)的條件查詢(xún)一類(lèi)的數(shù)據(jù):
一類(lèi)名.objects.filter(多類(lèi)名小寫(xiě)__多類(lèi)屬性名__條件名)
通過(guò)一類(lèi)的條件查詢(xún)多類(lèi)的數(shù)據(jù):
多類(lèi)名.objects.filter(關(guān)聯(lián)屬性__一類(lèi)屬性名__條件名)
12. 插入、更新和刪除
調(diào)用一個(gè)模型類(lèi)對(duì)象的save方法的時(shí)候就可以實(shí)現(xiàn)對(duì)模型類(lèi)對(duì)應(yīng)數(shù)據(jù)表的插入和更新。
調(diào)用一個(gè)模型類(lèi)對(duì)象的delete方法的時(shí)候就可以實(shí)現(xiàn)對(duì)模型類(lèi)對(duì)應(yīng)數(shù)據(jù)表數(shù)據(jù)的刪除。
13. 自關(guān)聯(lián)
自關(guān)聯(lián)是一種特殊的一對(duì)多的關(guān)系。
案例:顯示廣州市的上級(jí)地區(qū)和下級(jí)地區(qū)。
地區(qū)表:id, atitle, aParent_id;
mysql終端中批量執(zhí)行sql語(yǔ)句:source areas.sql;
14. 管理器
BookInfo.objects.all()->objects是一個(gè)什么東西呢?
答:objects是Django幫我自動(dòng)生成的管理器對(duì)象,通過(guò)這個(gè)管理器可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的查詢(xún)。
objects是models.Manger類(lèi)的一個(gè)對(duì)象。自定義管理器之后Django不再幫我們生成默認(rèn)的objects管理器。
14.1 自定義模型管理器類(lèi)
14.2 自定義管理器類(lèi)的應(yīng)用場(chǎng)景
1) 改變查詢(xún)的結(jié)果集。
比如調(diào)用BookInfo.books.all()返回的是沒(méi)有刪除的圖書(shū)的數(shù)據(jù)。
2) 添加額外的方法。
管理器類(lèi)中定義一個(gè)方法幫我們操作模型類(lèi)對(duì)應(yīng)的數(shù)據(jù)表。
使用self.model()就可以創(chuàng)建一個(gè)跟自定義管理器對(duì)應(yīng)的模型類(lèi)對(duì)象。
小結(jié):
Django默認(rèn)生成的表名:
應(yīng)用名小寫(xiě)_模型類(lèi)名小寫(xiě)。
元選項(xiàng):
需要在模型類(lèi)中定義一個(gè)元類(lèi)Meta,在里面定義一個(gè)類(lèi)屬性db_table就可以指定表名。
視圖
接收請(qǐng)求,進(jìn)行處理,與M和T進(jìn)行交互,返回應(yīng)答。
返回html內(nèi)容 HttpResponse,也可能重定向 redirect,還可以返回json數(shù)據(jù)。
2.1 使用
request參數(shù)必須有。是一個(gè)HttpRequest類(lèi)型的對(duì)象。參數(shù)名可以變化,
但不要更改。
建立url和視圖函數(shù)之間的對(duì)應(yīng)關(guān)系。
2.2 url配置的過(guò)程
url:http://127.0.0.1:8000/aindex?a=1
404:找不到頁(yè)面,關(guān)閉調(diào)試模式之后,默認(rèn)會(huì)顯示一個(gè)標(biāo)準(zhǔn)的錯(cuò)誤頁(yè)面,如果要顯示自定義的頁(yè)面,則需要的templates目錄下面自定義一個(gè)404.html文件。
a) url沒(méi)有配置
b) url配置錯(cuò)誤
500: 服務(wù)器端的錯(cuò)誤。
a) 視圖出錯(cuò)
網(wǎng)站開(kāi)發(fā)完成需要關(guān)閉調(diào)試模式,在settings.py文件中:
DEBUG=False
ALLOWED_HOST=[ ‘*’]
進(jìn)行url匹配時(shí),把所需要的捕獲的部分設(shè)置成一個(gè)正則表達(dá)式組,這樣django框架就會(huì)自動(dòng)把匹配成功后相應(yīng)組的內(nèi)容作為參數(shù)傳遞給視圖函數(shù)。
位置參數(shù),參數(shù)名可以隨意指定
?P<組名>
關(guān)鍵字參數(shù),視圖中參數(shù)名必須和正則表達(dá)式組名一致.
a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/login 時(shí)顯示登錄頁(yè)面。
b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login。
c) 編寫(xiě)模板文件login.html。
url 視圖 模板文件
/login login login.html
a) 設(shè)計(jì)url,點(diǎn)擊登錄頁(yè)的登錄按鈕發(fā)起請(qǐng)求http://127.0.0.1:8000/login_check時(shí)進(jìn)行登錄校驗(yàn)。
b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login_check。
接收表單提交過(guò)來(lái)的數(shù)據(jù)。
進(jìn)行登錄校驗(yàn),若用戶名密碼正確則跳轉(zhuǎn)到登錄成功頁(yè)。若失敗在跳轉(zhuǎn)到登錄頁(yè)面。
c) 登錄成功后跳轉(zhuǎn)到首頁(yè)。
url 視圖 模板文件
/login_check login_check 無(wú)
7.1 基本概念
異步的javascript。在不全部加載某一個(gè)頁(yè)面部的情況下,對(duì)頁(yè)面進(jìn)行局的刷新,ajax請(qǐng)求都在后臺(tái)。
圖片,css文件,js文件都是靜態(tài)文件。
7.2 Ajax登錄案例
a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/login_ajax 時(shí)顯示登錄頁(yè)面。
b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login_ajax。
c) 編寫(xiě)模板文件login_ajax.html。
在里面寫(xiě)jquery代碼發(fā)起ajax請(qǐng)求。
a) 設(shè)計(jì)url,點(diǎn)擊登錄頁(yè)的登錄按鈕發(fā)起請(qǐng)求http://127.0.0.1:8000/login_ajax_check時(shí)進(jìn)行登錄校驗(yàn)。
b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login_ajax_check。
接收post提交過(guò)來(lái)的數(shù)據(jù)。
進(jìn)行登錄校驗(yàn),并返回json內(nèi)容。 JsonRepsone
Json格式如下:
{‘res’:‘1’} #表示登錄成功
{‘res’:‘0’} #表示登錄失敗
http協(xié)議是無(wú)狀態(tài)的。下一次去訪問(wèn)一個(gè)頁(yè)面時(shí)并不知道上一次對(duì)這個(gè)頁(yè)面做了什么。
8.1 Cookie
cookie是由服務(wù)器生成,存儲(chǔ)在瀏覽器端的一小段文本信息。
cookie的特點(diǎn):
記住用戶名案例。
8.2 Session
session存儲(chǔ)在服務(wù)器端。
session的特點(diǎn):
記住用戶登錄狀態(tài)案例。
8.3 cookie和session的應(yīng)用場(chǎng)景
cookie:記住用戶名。安全性要求不高。
session:涉及到安全性要求比較高的數(shù)據(jù)。銀行卡賬戶,密碼
模板
產(chǎn)生html,控制頁(yè)面上展示的內(nèi)容。模板文件不僅僅是一個(gè)html文件。
模板文件包含兩部分內(nèi)容:
通常是在視圖函數(shù)中使用模板產(chǎn)生html內(nèi)容返回給客戶端。
a) 加載模板文件 loader.get_template
獲取模板文件的內(nèi)容,產(chǎn)生一個(gè)模板對(duì)象。
b) 定義模板上下文 RequeseContext
給模板文件傳遞數(shù)據(jù)。
c) 模板渲染產(chǎn)生html頁(yè)面內(nèi)容 render
用傳遞的數(shù)據(jù)替換相應(yīng)的變量,產(chǎn)生一個(gè)替換后的標(biāo)準(zhǔn)的html內(nèi)容。
模板語(yǔ)言簡(jiǎn)稱(chēng)為DTL。(Django Template Language)
4.1 模板變量
模板變量名是由數(shù)字,字母,下劃線和點(diǎn)組成的,不能以下劃線開(kāi)頭。
使用模板變量:{{模板變量名}}
模板變量的解析順序:
例如:{{ book.btitle }}
例如:{{book.0}}
如果解析失敗,則產(chǎn)生內(nèi)容時(shí)用空字符串填充模板變量。
使用模板變量時(shí),.前面的可能是一個(gè)字典,可能是一個(gè)對(duì)象,還可能是一個(gè)列表。
4.2 模板標(biāo)簽
{% 代碼段 %}
for循環(huán):
{% for x in 列表 %}
列表不為空時(shí)執(zhí)行
{% empty %}列表為空時(shí)執(zhí)行
{% endfor %}可以通過(guò){{ forloop.counter }}得到for循環(huán)遍歷到了第幾次。
{% if 條件 %}
{% elif 條件 %}
{% else %}
{% endif %}
關(guān)系比較操作符:> < >= <= == !=
注意:進(jìn)行比較操作時(shí),比較操作符兩邊必須有空格。
邏輯運(yùn)算:not and or
4.3 過(guò)濾器
過(guò)濾器用于對(duì)模板變量進(jìn)行操作。
date:改變?nèi)掌诘娘@示格式。
length:求長(zhǎng)度。字符串,列表.
default:設(shè)置模板變量的默認(rèn)值。
格式:模板變量|過(guò)濾器:參數(shù)
自定義過(guò)濾器。
自定義的過(guò)濾器函數(shù),至少有一個(gè)參數(shù),最多兩個(gè)
參考資料:(模板標(biāo)簽和內(nèi)置過(guò)濾器)
http://python.usyiyi.cn/documents/django_182/ref/templates/builtins.html
4.4 模板注釋
單行注釋:{# 注釋內(nèi)容 #}
多行注釋:{% comment %}
注釋內(nèi)容
{% endcomment %}
模板繼承也是為了重用html頁(yè)面內(nèi)容。
在父模板里可以定義塊,使用標(biāo)簽:
{% block 塊名 %}
塊中間可以寫(xiě)內(nèi)容,也可以不寫(xiě)
{% endblock 塊名%}
子模板去繼承父模板之后,可以重寫(xiě)父模板中的某一塊的內(nèi)容。
繼承格式:{% extends 父模板文件路徑%}
{% block 塊名 %}
{{ block.super}} #獲取父模板中塊的默認(rèn)內(nèi)容
重寫(xiě)的內(nèi)容
{% endblock 塊名%}
6. html轉(zhuǎn)義
編輯商品詳情信息,數(shù)據(jù)表中保存的是html內(nèi)容。
在模板上下文中的html標(biāo)記默認(rèn)是會(huì)被轉(zhuǎn)義的。
小于號(hào)< 轉(zhuǎn)換為<
大于號(hào)> 轉(zhuǎn)換為>
單引號(hào)’ 轉(zhuǎn)換為’
雙引號(hào)" 轉(zhuǎn)換為 "
與符號(hào)& 轉(zhuǎn)換為 &
要關(guān)閉模板上下文字符串的轉(zhuǎn)義:可以使用 {{ 模板變量|safe}}
也可以使用:
{% autoescape off %}
模板語(yǔ)言代碼
{% endautoescape %}
模板硬編碼中的字符串默認(rèn)不會(huì)經(jīng)過(guò)轉(zhuǎn)義,如果需要轉(zhuǎn)義,那需要手動(dòng)進(jìn)行轉(zhuǎn)義。
7. csrf攻擊
首先做一個(gè)登錄頁(yè),讓用戶輸入用戶名和密碼進(jìn)行登錄,登錄成功之后跳轉(zhuǎn)的修改密碼頁(yè)面。在修改密碼頁(yè)面輸入新密碼,點(diǎn)擊確認(rèn)按鈕完成密碼修改。
登錄頁(yè)需要一個(gè)模板文件login.html.修改密碼頁(yè)面也需要一個(gè)模板文件change_pwd.html.
顯示登錄頁(yè)的視圖login,驗(yàn)證登錄的視圖login_check,顯示發(fā)帖頁(yè)的視圖change_pwd,處理修改密碼的視圖change_pwd_action.
加功能:
a)只有用戶登錄之后才可以進(jìn)行修改密碼操作。
登錄裝飾器函數(shù)。
django防止csrf的方式:
防御原理:
在用戶注冊(cè)、登錄頁(yè)面,為了防止暴力請(qǐng)求,可以加入驗(yàn)證碼功能,如果驗(yàn)證碼錯(cuò)誤,則不需要繼續(xù)處理,可以減輕業(yè)務(wù)服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器的壓力。
當(dāng)某一個(gè)url配置的地址發(fā)生變化時(shí),頁(yè)面上使用反向解析生成地址的位置不需要發(fā)生變化。
根據(jù)url 正則表達(dá)式的配置動(dòng)態(tài)的生成url。
在項(xiàng)目urls中包含具體應(yīng)用的urls文件時(shí)指定namespace;
在應(yīng)用的urls中配置是指定name;
在模板文件中使用時(shí),格式如下:
{% url ‘namespace名字:name’ %} 例如{% url ‘booktest:fan2’%}
帶位置參數(shù):
{% url ‘namespace名字:name’ 參數(shù) %} 例如{% url ‘booktest:fan2’ 1%}
帶關(guān)鍵字參數(shù):
{% url ‘namespace名字:name’ 關(guān)鍵字參數(shù) %} 例如{% url ‘booktest:fan2’ id=1 %}
在重定向的時(shí)候使用反向解析:
from django.core.urlresolvers import reverse
無(wú)參數(shù):
reverse(‘namespace名字:name名字’)
如果有位置參數(shù)
reverse(‘namespace名字:name名字’, args = 位置參數(shù)元組)
如果有關(guān)鍵字參數(shù)
reverse(‘namespace名字:name名字’, kwargs=字典)
其他技術(shù)
1.1 使用
在 網(wǎng)頁(yè)使用的css文件,js文件和圖片叫做靜態(tài)文件。
新建靜態(tài)文件夾 static。
配置靜態(tài)文件所在的物理目錄。Settings.py
STATIC_URL設(shè)置訪問(wèn)靜態(tài)文件對(duì)應(yīng)的url。
STATICFILES_DIRS設(shè)置靜態(tài)文件所在的物理目錄。
動(dòng)態(tài)生成靜態(tài)文件的路徑。
1.2 加載目錄
STATICFILES_FINDERS=(‘django.contrib.staticfiles.finders.FileSystemFinder’, ‘django.contrib.staticfiles.finders.AppDirectoriesFinder’)
2. 中間件
中間件函數(shù)是django框架給我們預(yù)留的函數(shù)接口,讓我們可以干預(yù)請(qǐng)求和應(yīng)答的過(guò)程。
2.1 獲取瀏覽器端的ip地址
使用request對(duì)象的META屬性:request.META[‘REMOTE_ADDR’]
2.2 使用中間件
新建middleware.py文件。
定義中間件類(lèi)。
在類(lèi)中定義中間件預(yù)留函數(shù)。
init:服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用。
process_request:是在產(chǎn)生request對(duì)象,進(jìn)行url匹配之前調(diào)用。
process_view:是url匹配之后,調(diào)用視圖函數(shù)之前。
process_response:視圖函數(shù)調(diào)用之后,內(nèi)容返回給瀏覽器之前。
process_exception:視圖函數(shù)出現(xiàn)異常,會(huì)調(diào)用這個(gè)函數(shù)。
如果注冊(cè)的多個(gè)中間件類(lèi)中包含process_exception函數(shù)的時(shí)候,調(diào)用的順序跟注冊(cè)的順序是相反的。
3) 注冊(cè)中間件類(lèi)。
3.1 使用
python mange.py createsuperuser
自定義模型管理類(lèi)。
注冊(cè)模型類(lèi)的時(shí)候給register函數(shù)添加第二個(gè)參數(shù),就是自定義模型管理類(lèi)的名字。
3.2 模型管理類(lèi)相關(guān)屬性
商品銷(xiāo)售網(wǎng)站。
4.1 配置上傳文件保存目錄
新建上傳文件保存目錄。
配置上傳文件保存目錄。
4.2 后臺(tái)管理頁(yè)面上傳圖片
設(shè)計(jì)模型類(lèi)。
遷移生成表格。
注冊(cè)模型類(lèi)。
4.3 用戶自定義頁(yè)面上傳圖片
定義用戶上傳圖片的頁(yè)面并顯示,是一個(gè)自定義的表單。
定義接收上傳文件的視圖函數(shù)。
request對(duì)象有一個(gè)FILES的屬性,類(lèi)似于字典,通過(guò)request.FILES可以獲取上傳文件的處理對(duì)象。
在django中,上傳文件不大于2.5M,文件放在內(nèi)存中。上傳文件大于2.5M,文件內(nèi)容寫(xiě)到一個(gè)臨時(shí)文件中。
Django處理上傳文件的兩個(gè)類(lèi):
FILE_UPLOAD_HANDLERS= (“django.core.files.uploadhandler.MemoryFileUploadHandler”,
“django.core.files.uploadhandler.TemporaryFileUploadHandler”)
上傳圖片參考資料:
查詢(xún)出所有省級(jí)地區(qū)的信息,顯示在頁(yè)面上。
AeroInfo.objects.filter(aParent__isnull = True)
from django.core.paginator import Paginator
paginator = Paginator(areas, 10) #按每頁(yè)10條數(shù)據(jù)進(jìn)行分頁(yè)
Paginator類(lèi)對(duì)象的屬性:
屬性名 說(shuō)明
num_pages 返回分頁(yè)之后的總頁(yè)數(shù)
page_range 返回分頁(yè)后頁(yè)碼的列表
Paginator類(lèi)對(duì)象的方法:
方法名 說(shuō)明
page(self, number) 返回第number頁(yè)的Page類(lèi)實(shí)例對(duì)象
Page類(lèi)對(duì)象的屬性:
屬性名 說(shuō)明
number 返回當(dāng)前頁(yè)的頁(yè)碼
object_list 返回包含當(dāng)前頁(yè)的數(shù)據(jù)的查詢(xún)集
paginator 返回對(duì)應(yīng)的Paginator類(lèi)對(duì)象
Page類(lèi)對(duì)象的方法:
屬性名 說(shuō)明
has_previous 判斷當(dāng)前頁(yè)是否有前一頁(yè)
has_next 判斷當(dāng)前頁(yè)是否有下一頁(yè)
previous_page_number 返回前一頁(yè)的頁(yè)碼
next_page_number 返回下一頁(yè)的頁(yè)碼
分頁(yè)參考資料:
http://python.usyiyi.cn/translate/django_182/topics/pagination.html
6. 省市縣選擇案例
$.get(’/prov’, function(data){
})
$.get(’/city?pid=’+pid, function(data){
})
request.GET.get(‘pid’)
或者:
.get(′/city′+.get('/city'+.get(′/city′+(this).val(), function(data){
})
$.get(’/dis?pid=’+pid, function(data){
})
或者:
.get(′/dis′+.get('/dis'+.get(′/dis′+(this).val(), function(data){
})
總結(jié)
- 上一篇: 那些因素会影响微型真空泵间接抽水的效果?
- 下一篇: 没有目标的人是可悲的-2006