Python程序開發(fā)案例教程(第2版)課件 第16章 Django核心組件詳解_第1頁
Python程序開發(fā)案例教程(第2版)課件 第16章 Django核心組件詳解_第2頁
Python程序開發(fā)案例教程(第2版)課件 第16章 Django核心組件詳解_第3頁
Python程序開發(fā)案例教程(第2版)課件 第16章 Django核心組件詳解_第4頁
Python程序開發(fā)案例教程(第2版)課件 第16章 Django核心組件詳解_第5頁
已閱讀5頁,還剩150頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第16章Django核心組件詳解《Python程序開發(fā)案例教程(第2版))》學(xué)習(xí)目標(biāo)/Target

熟悉路由系統(tǒng),能夠歸納路由系統(tǒng)處理請求的過程以及URL匹配的規(guī)則掌握路由轉(zhuǎn)換器的使用,能夠使用內(nèi)置轉(zhuǎn)換器和自定義轉(zhuǎn)換器限制URL模式中的參數(shù)類型掌握路由分發(fā)的方式,能夠使用include()實(shí)現(xiàn)路由分發(fā)的功能掌握向視圖傳遞額外參數(shù)的方式,能夠通過path()函數(shù)向視圖傳遞額外參數(shù)熟悉反向解析URL的方式,能夠通過reverse()函數(shù)實(shí)現(xiàn)反向解析URL的功能學(xué)習(xí)目標(biāo)/Target

掌握模型的定義與使用,能夠根據(jù)需求定義模型和使用模型熟悉模型的字段,能夠歸納常見字段的功能掌握數(shù)據(jù)的增刪改查操作,能夠通過objects管理器實(shí)現(xiàn)添加、查詢、更新和刪除數(shù)據(jù)的功能掌握模板,能夠在項(xiàng)目中使用模板以及語法規(guī)則熟悉視圖,能夠歸納請求對象和響應(yīng)對象的常見屬性和方法學(xué)習(xí)目標(biāo)/Target

掌握生成響應(yīng)的方式,能夠通過render()函數(shù)生成響應(yīng)掌握視圖類的定義與使用方式,能夠定義與使用視圖類熟悉分頁的實(shí)現(xiàn)方式,能夠通過Paginator類的屬性和方法實(shí)現(xiàn)分頁的功能章節(jié)概述/SummaryDjango是一個(gè)功能強(qiáng)大的Web應(yīng)用框架,它內(nèi)部集成了大量的組件,核心組件包括路由系統(tǒng)(Routingsystem)、模型(Model)、模板(Template)、視圖(View)等,這些組件之間相互協(xié)作,為構(gòu)建可靠、高效且易于維護(hù)的Web應(yīng)用提供了極大的支持,讓開發(fā)過程變得簡便而靈活。本章將重點(diǎn)介紹路由系統(tǒng)、模型、模板、視圖這幾個(gè)核心組件。目錄/Contents010203路由系統(tǒng)模型模板04視圖05實(shí)例:用戶登錄路由系統(tǒng)16.1

先定一個(gè)小目標(biāo)!熟悉路由系統(tǒng),能夠歸納路由系統(tǒng)處理請求的過程以及URL匹配的規(guī)則16.1.1路由系統(tǒng)簡介路由系統(tǒng)簡介在Django中,路由系統(tǒng)扮演著非常重要的角色,它負(fù)責(zé)接收客戶端發(fā)送的請求,并將其分派給相應(yīng)的視圖進(jìn)行處理。處理完請求后,路由系統(tǒng)會將視圖返回的響應(yīng)發(fā)回至客戶端。這個(gè)過程中,路由系統(tǒng)起到了一個(gè)中介的角色,建立了請求和視圖之間的聯(lián)系。16.1.1路由系統(tǒng)簡介路由系統(tǒng)簡介16.1.1路由系統(tǒng)簡介Django會按照以下流程處理HTTP請求,具體過程如下。加載項(xiàng)目的配置文件,從配置文件中查找配置項(xiàng)ROOT_URLCONF對應(yīng)的值,以獲取根URLconf,即根URL配置文件。從根URLconf中查找urlpatterns,將請求的URL與urlpatterns中定義的URL模式按順序逐個(gè)進(jìn)行匹配。如果成功匹配到URL模式,那么停止匹配,并調(diào)用該URL模式對應(yīng)的視圖返回響應(yīng)。如果沒有匹配到URL模式,或匹配過程中出現(xiàn)異常,那么Django的路由系統(tǒng)會調(diào)用錯(cuò)誤處理視圖并返回響應(yīng)。路由系統(tǒng)簡介16.1.1路由系統(tǒng)簡介一個(gè)項(xiàng)目允許有多個(gè)urls.py,但Django需要一個(gè)urls.py作為入口,這個(gè)作為入口的urls.py就是根URLconf,它由settings.py文件中的配置項(xiàng)ROOT_URLCONF指定。通常情況下,配置項(xiàng)ROOT_URLCONF的值為“項(xiàng)目名.urls”。例如,在mysite項(xiàng)目的配置文件中ROOT_URLCONF的值為mysite.urls.py,示例代碼如下:ROOT_URLCONF="mysite.urls"ROOT_URLCONF指定了mysite目錄下的urls.py作為根URLconf。路由系統(tǒng)簡介16.1.1路由系統(tǒng)簡介為了保證項(xiàng)目結(jié)構(gòu)清晰,開發(fā)人員通常會在Django項(xiàng)目的每個(gè)應(yīng)用下創(chuàng)建urls.py文件,用于配置該應(yīng)用的URL模式。當(dāng)Django的路由系統(tǒng)接收到請求后,先根據(jù)請求的URL匹配根URLconf,找到匹配的子應(yīng)用,再進(jìn)一步匹配子URLconf,直到匹配完成。URL模式配置有著一定的格式要求。下面看一下mysite項(xiàng)目中應(yīng)用hello的URL模式,具體代碼如下所示:16.1.1路由系統(tǒng)簡介路由系統(tǒng)簡介urlpatterns=[path('',views.index)]變量urlpatterns的值是一個(gè)列表,該列表的元素是使用path()函數(shù)匹配的URL模式。path()函數(shù)定義在django.urls模塊中,它的語法格式如下:16.1.1路由系統(tǒng)簡介路由系統(tǒng)簡介path(route,view,kwargs=None,name=None)語法格式route:必選參數(shù),表示匹配的URL模式,它的值是一個(gè)字符串。注意,字符串中可以包含以“<>”標(biāo)識的捕獲參數(shù),一般格式為<參數(shù)名>,這些參數(shù)將以關(guān)鍵字參數(shù)的形式傳遞給視圖。view:必選參數(shù),表示視圖函數(shù)。當(dāng)Django匹配到URL模式后會調(diào)用相應(yīng)的視圖函數(shù),并將django.http.HttpRequest對象作為第一個(gè)參數(shù)傳遞給視圖函數(shù)。kwargs:可選參數(shù),用于接收URL地址中的任意關(guān)鍵字參數(shù),并將其組織為一個(gè)字典類型的數(shù)據(jù)傳遞給目標(biāo)視圖。name:可選參數(shù),用于為URL模式取名,以便Django可以在任意地方可以唯一引用。使用path()函數(shù)對URL模式進(jìn)行匹配時(shí),不會對URL中的協(xié)議類型、域名、端口號進(jìn)行匹配。例如,path()函數(shù)在匹配:8000/hello/時(shí),只會匹配/hello/。結(jié)合對path()函數(shù)的功能分析以上示例中的URL配置可知:當(dāng)請求的URL匹配到“/”時(shí),它會在列表urlpatterns中找到匹配的元素,并調(diào)用視圖views.index,即調(diào)用views.py文件中定義的index()函數(shù),并在該函數(shù)中傳入django.http.HttpRequest對象。16.1.1路由系統(tǒng)簡介路由系統(tǒng)簡介

先定一個(gè)小目標(biāo)!掌握路由轉(zhuǎn)換器的使用,能夠使用內(nèi)置轉(zhuǎn)換器和自定義轉(zhuǎn)換器限制URL模式中的參數(shù)類型16.1.2路由轉(zhuǎn)換器路由轉(zhuǎn)換器格式16.1.2路由轉(zhuǎn)換器URL模式中可以包含各種類型的參數(shù),比如字符串、整數(shù)等。然而,在有些場景下需要確保參數(shù)的類型是固定的。例如根據(jù)ID值從數(shù)據(jù)庫查詢數(shù)據(jù)時(shí),ID值必須是整數(shù)類型。為了滿足這個(gè)需求,Django設(shè)計(jì)了路由轉(zhuǎn)換器。路由轉(zhuǎn)換器用于將URL模式中的參數(shù)轉(zhuǎn)換為指定的類型,以確保參數(shù)類型的準(zhǔn)確性和一致性。<路由轉(zhuǎn)換器:參數(shù)名>語法格式Django內(nèi)置了5種路由轉(zhuǎn)換器,并支持開發(fā)人員自定義路由轉(zhuǎn)換器。1.內(nèi)置路由轉(zhuǎn)換器Django內(nèi)置了5種路由轉(zhuǎn)換器,這些路由轉(zhuǎn)換器的功能具體如下。str:匹配任何非空字符串,但不包含分隔符“/”。若URL模式中沒有為參數(shù)指定路由轉(zhuǎn)換器,則默認(rèn)使用該路由轉(zhuǎn)換器。int:匹配0或任何正整數(shù)。slug:匹配由字母、數(shù)字、連字符和下畫線組成的字符串,例如type_blog-django。uuid:匹配UUID格式的字符串。轉(zhuǎn)換器必須包含連字符,且所有字母均為小寫,以避免多個(gè)URL映射到同一頁面。例如59c08cbe-b828-11e9-a3b8-408d5c7ffd28。path:匹配任何非空字符串,包括分隔符“/”。16.1.2路由轉(zhuǎn)換器1.內(nèi)置路由轉(zhuǎn)換器16.1.2路由轉(zhuǎn)換器在mysite項(xiàng)目的urls.py中增加使用路由轉(zhuǎn)換器的代碼,分別使用上述5種路由轉(zhuǎn)換器定義URL模式,具體代碼如下:urlpatterns=[……path('str/<str:str_type>',views.index),#使用路由轉(zhuǎn)換器strpath('int/<int:int_type>',views.index),#使用路由轉(zhuǎn)換器intpath('slug/<slug:slug_type>',views.index),#使用路由轉(zhuǎn)換器slugpath('uuid/<uuid:uuid_type>',views.index),#使用路由轉(zhuǎn)換器uuidpath('path/<path:path_type>',views.index),#使用路由轉(zhuǎn)換器path]示例2.自定義路由轉(zhuǎn)換器自定義路由轉(zhuǎn)換器本質(zhì)上是一個(gè)類,這個(gè)類需要包含類屬性regex、類方法to_python()和to_url(),其中屬性regex用于設(shè)置匹配規(guī)則,to_python()方法用于將匹配到的字符串轉(zhuǎn)換成要傳遞到視圖中的類型;to_url()方法用于將Python數(shù)據(jù)類型轉(zhuǎn)換為URL模式中使用的字符串。16.1.2路由轉(zhuǎn)換器自定義路由轉(zhuǎn)換器定義完成之后,需要通過urls模塊中的register_converter()函數(shù)將其注冊到Django的路由系統(tǒng)。register_converter函數(shù)的格式如下:register_converter(converter,type_name)語法格式register_converter()函數(shù)中有兩個(gè)參數(shù),其中參數(shù)converter用于指定要注冊的自定義路由轉(zhuǎn)換器;參數(shù)type_name用于為自定義路由轉(zhuǎn)換器指定一個(gè)唯一的名稱,此名稱會在URL模式中使用。16.1.2路由轉(zhuǎn)換器2.自定義路由轉(zhuǎn)換器(1)創(chuàng)建名稱為chapter16的Django項(xiàng)目,在該項(xiàng)目中創(chuàng)建應(yīng)用app01,并在項(xiàng)目的配置文件中激活app01應(yīng)用,具體代碼如下加粗部分所示:16.1.2路由轉(zhuǎn)換器2.自定義路由轉(zhuǎn)換器INSTALLED_APPS=["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.contrib.sessions","django.contrib.messages","django.contrib.staticfiles",'app01',](2)在chapter16項(xiàng)目的urls.py文件中配置根路由,具體代碼如下加粗部分所示:16.1.2路由轉(zhuǎn)換器2.自定義路由轉(zhuǎn)換器fromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path("admin/",admin.site.urls),

path('app01/',include('app01.urls')),](3)在應(yīng)用app01中新建converter.py文件,在該文件中定義一個(gè)表示自定義路由轉(zhuǎn)換器的類MyConverter,并通過register_converter()函數(shù)將自定義路由轉(zhuǎn)換器注冊到路由系統(tǒng)中。定義與注冊自定義路由轉(zhuǎn)換器的代碼如下所示:16.1.2路由轉(zhuǎn)換器2.自定義路由轉(zhuǎn)換器fromdjango.urlsimportregister_converterclassMyConverter:regex='1[3-9]\d{9}'#匹配規(guī)則defto_python(self,value):#將匹配到的字符串轉(zhuǎn)換成要傳遞到視圖中的類型

returnvaluedefto_url(self,value):#將Python數(shù)據(jù)類型轉(zhuǎn)換為URL模式中使用的字符串

returnvalueregister_converter(MyConverter,'mobile')

#注冊自定義路由轉(zhuǎn)換器(4)路由轉(zhuǎn)換器定義好之后,在app01應(yīng)用中新建子路由文件urls.py,在該文件中導(dǎo)入路由轉(zhuǎn)換器所在的文件,即導(dǎo)入converter模塊,然后配置子路由,使用自定義的路由轉(zhuǎn)換器匹配mobile/后面的手機(jī)號碼,具體代碼如下所示:16.1.2路由轉(zhuǎn)換器2.自定義路由轉(zhuǎn)換器fromdjango.urlsimportpathfromapp01importviews,converterurlpatterns=[path('mobile/<mobile:phone_num/>',views.show_mobile)](5)在app01應(yīng)用的views.py文件中,增加定義視圖函數(shù)show_mobile()的代碼,該函數(shù)的作用是將手機(jī)號碼呈現(xiàn)在頁面中,具體代碼如下所示:16.1.2路由轉(zhuǎn)換器2.自定義路由轉(zhuǎn)換器fromdjango.httpimportHttpResponsedefshow_mobile(request,phone_num):returnHttpResponse(f'手機(jī)號碼為:{phone_num}')(6)運(yùn)行開發(fā)服務(wù)器啟動chapter16項(xiàng)目,在瀏覽器中訪問:8000/app01/mobile,頁面效果如圖所示。16.1.2路由轉(zhuǎn)換器2.自定義路由轉(zhuǎn)換器

先定一個(gè)小目標(biāo)!掌握路由分發(fā)的方式,能夠使用include()實(shí)現(xiàn)路由分發(fā)的功能16.1.3路由分發(fā)路由分發(fā)一個(gè)Django項(xiàng)目中會包含多個(gè)應(yīng)用,并且每個(gè)應(yīng)用可能有多個(gè)URL模式,如果將項(xiàng)目中所有的URL模式都保存在根URLconf中,那么URLconf勢必會變得非常臃腫,不利于后期維護(hù)。為了解決上述問題,Django允許每個(gè)應(yīng)用將URL封裝到本應(yīng)用的URLconf中,在根URLconf使用urls模塊的include()函數(shù)將應(yīng)用中的URLconf導(dǎo)入即可實(shí)現(xiàn)路由分發(fā),這樣的路由分發(fā)可以有效降低應(yīng)用的URLconf與根URLconf的耦合度。16.1.3路由分發(fā)使用include()實(shí)現(xiàn)路由分發(fā)有兩種方式,分別是引入應(yīng)用URLconf和引入U(xiǎn)RL模式列表,關(guān)于它們的介紹如下。include(module)語法格式chapter16項(xiàng)目實(shí)現(xiàn)路由分發(fā)的方式是引入應(yīng)用URLconf,這種方式其實(shí)將應(yīng)用程序的URL配置文件作為參數(shù)傳遞給include()函數(shù),這樣不僅可以將不同應(yīng)用程序的路由規(guī)則集中在各自的URL配置文件中,還可以提高代碼的可維護(hù)性。引入應(yīng)用URLconf的語法格式如下所示。16.1.3路由分發(fā)1.引入應(yīng)用URLconfmodule:用于指定應(yīng)用URLconf。在chapter16項(xiàng)目中創(chuàng)建及激活app02應(yīng)用,在項(xiàng)目的根URLconf中使用include()函數(shù)引入app02應(yīng)用的URLconf,具體代碼如下加粗部分所示:16.1.3路由分發(fā)1.引入應(yīng)用URLconffromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path("admin/",admin.site.urls),path('app01/',include('app01.urls')),

path('app02/',include('app02.urls')),#引入app02應(yīng)用的URLconf]在app02應(yīng)用中創(chuàng)建urls.py文件,在該文件中定義與應(yīng)用相關(guān)的URL模式,具體代碼如下:16.1.3路由分發(fā)1.引入應(yīng)用URLconffromdjango.urlsimportpathfromapp02importviewsurlpatterns=[path('test/',views.index),]為了驗(yàn)證以上方式是否成功實(shí)現(xiàn)路由分發(fā),這里可以在app02應(yīng)用的views.py文件中增加定義視圖函數(shù)的代碼,具體代碼如下所示。16.1.3路由分發(fā)1.引入應(yīng)用URLconffromdjangoimporthttpdefindex(request):returnhttp.HttpResponse('Routedistributionsuccessful!')除了引入應(yīng)用URLconf外,還可以給include()函數(shù)傳入包含URL模式的列表,通過引入U(xiǎn)RL模式列表的方式實(shí)現(xiàn)路由分發(fā)的功能。這種形式不需要在應(yīng)用中自行創(chuàng)建urls.py,只需在項(xiàng)目的urls.py文件中使用include()函數(shù)添加額外的URL模式列表即可。引入U(xiǎn)RL模式列表的語法格式如下所示。16.1.3路由分發(fā)2.引入U(xiǎn)RL模式列表include(module)語法格式module:用于指定包含一個(gè)或多個(gè)path實(shí)例的列表。在chapter16項(xiàng)目的urls.py文件中添加URL模式列表,之后使用include()函數(shù)引入U(xiǎn)RL模式列表,具體代碼如下加粗部分所示:16.1.3路由分發(fā)fromdjango.contribimportadminfromdjango.urlsimportpath,includefromapp02importviewsapp02_extra_patterns=[path('test02/',views.index),]urlpatterns=[……

path('app02/',include(app02_extra_patterns)),#引入U(xiǎn)RL模式列表]2.引入U(xiǎn)RL模式列表運(yùn)行開發(fā)服務(wù)器啟動chapter16項(xiàng)目,在瀏覽器中訪問:8000/app02/test02/,可以看到頁面中顯示了信息“Routedistributionsuccessful!”,說明通過引入U(xiǎn)RL模式列表的方式成功實(shí)現(xiàn)了路由分發(fā)的功能。16.1.3路由分發(fā)2.引入U(xiǎn)RL模式列表

先定一個(gè)小目標(biāo)!掌握向視圖傳遞額外參數(shù)的方式,能夠通過path()函數(shù)向視圖傳遞額外參數(shù)16.1.4向視圖傳遞額外參數(shù)向視圖傳遞額外參數(shù)16.1.4向視圖傳遞額外參數(shù)path()函數(shù)允許向視圖傳遞額外參數(shù),這些參數(shù)會存放在一個(gè)字典中,字典的鍵代表參數(shù)名,值代表參數(shù)值。使用path()函數(shù)的第三個(gè)參數(shù)可以向視圖傳遞額外參數(shù)。例如,在app02應(yīng)用的urls.py文件中增加URL模式,具體代碼如下:path('blog/',views.blog,{'blog_id':3}),示例代碼向視圖傳遞額外參數(shù)16.1.4向視圖傳遞額外參數(shù)當(dāng)路由系統(tǒng)匹配到blog/時(shí),會調(diào)用視圖blog,并向該視圖中傳遞值為3的參數(shù)blog_id。URL模式中向視圖傳遞了額外參數(shù),那么視圖需要增加接收額外參數(shù)的形參。例如,在app02應(yīng)用views.py文件中定義blog視圖,具體代碼如下:defblog(request,blog_id):returnhttp.HttpResponse(f'參數(shù)blog_id值為:{blog_id}')

先定一個(gè)小目標(biāo)!熟悉反向解析URL的方式,能夠通過reverse()函數(shù)實(shí)現(xiàn)反向解析URL的功能16.1.5反向解析URL在使用Django開發(fā)項(xiàng)目時(shí),可以直接在代碼中使用URL來定義視圖函數(shù)的路由規(guī)則,但這種方式會導(dǎo)致URL與項(xiàng)目之間的耦合度較高。如果在urls.py文件中修改了某個(gè)頁面的URL,那么相應(yīng)的視圖函數(shù)或模板也需要進(jìn)行相應(yīng)的修改。在維護(hù)或更新項(xiàng)目過程中,這種方式可能會引發(fā)錯(cuò)誤。16.1.5反向解析URLreverse()函數(shù)Django提供了urls模塊中的reverse()函數(shù)來實(shí)現(xiàn)反向解析。通過反向解析,Django服務(wù)器會根據(jù)視圖函數(shù)或路由規(guī)則的命名來動態(tài)生成URL,直到實(shí)際訪問時(shí)服務(wù)器才會獲取具體的URL。reverse(viewname,urlconf=None,args=None,kwargs=None,current_app=None)語法格式viewname:必選參數(shù),表示URL模式名稱或可調(diào)用的視圖。如果是URL模式名稱,則應(yīng)該是urls.py文件中的name屬性。urlconf:可選參數(shù),用于指定要使用的URLconf。默認(rèn)情況下,Django會使用項(xiàng)目的根URLconf。args:可選參數(shù),傳遞給URL的列表類型的參數(shù)。kwargs:可選參數(shù),傳遞給URL的字典類型的參數(shù)。current_app:可選參數(shù),表示當(dāng)前視圖所屬的應(yīng)用。reverse()函數(shù)中參數(shù)args與kwargs不能同時(shí)使用。16.1.5反向解析URLreverse()函數(shù)在app02應(yīng)用的urls.py文件中定義URL模式,具體代碼如下:urlpatterns=[path('url-reverse/',views.get_url,name='url'),]16.1.5反向解析URLreverse()函數(shù)在app02應(yīng)用中的views.py文件中定義get_url()視圖,該視圖可在頁面顯示通過反向解析獲得的URL地址,具體代碼如下:fromdjango.shortcutsimportreversedefget_url(request):returnhttp.HttpResponse(f"反向解析的URL為:{reverse('url')}")在瀏覽器訪問:8000/app02/url-reverse/后,頁面效果如圖所示。16.1.5反向解析URLreverse()函數(shù)模型16.2

先定一個(gè)小目標(biāo)!掌握模型的定義與使用,能夠根據(jù)需求定義模型和使用模型16.2.1模型簡介模型簡介在Django中,模型是以Python類的形式定義的,每個(gè)模型類對應(yīng)一張數(shù)據(jù)表,模型類的每個(gè)屬性對應(yīng)數(shù)據(jù)表中的一個(gè)字段。模型類定義在應(yīng)用的

models.py

文件中,并繼承

models.Model

類。16.2.1模型簡介16.2.1模型簡介模型簡介在chapter16項(xiàng)目中創(chuàng)建及激活app03應(yīng)用,在該應(yīng)用的models.py

文件中定義一個(gè)表示書籍信息的模型類,具體代碼如下:fromdjango.dbimportmodelsclassBookInfo(models.Model):name=models.CharField(max_length=20,verbose_name="名稱")pub_date=models.DateField(verbose_name="發(fā)布日期")read_count=models.IntegerField(default=0,verbose_name="閱讀量")comment_count=models.IntegerField(default=0,verbose_name="評論量")is_delete=models.BooleanField(default=False,verbose_name="邏輯刪除")def__str__(self):return模型簡介模型類定義好以后需要映射到數(shù)據(jù)庫,映射分為兩步:生成遷移文件和執(zhí)行遷移文件。從本質(zhì)上看,生成遷移文件是通過ORM機(jī)制生成執(zhí)行數(shù)據(jù)庫操作所需的SQL語句,而執(zhí)行遷移文件則是執(zhí)行遷移文件中的SQL語句。16.2.1模型簡介16.2.1模型簡介1.生成遷移生成遷移文件的命令具體如下:pythonmanage.pymakemigrations命令格式16.2.1模型簡介(1)chapter16項(xiàng)目默認(rèn)使用的數(shù)據(jù)庫是SQLite3,由于本書前面沒有講過SQLite3數(shù)據(jù)庫,為了方便大家查詢數(shù)據(jù)庫,所以這里將SQLite3數(shù)據(jù)庫換成MySQL數(shù)據(jù)庫。在chapter16項(xiàng)目的settings.py文件中將默認(rèn)使用的數(shù)據(jù)庫修改為MySQL,具體代碼如下所示:DATABASES={'default':{'ENGINE':'django.db.backends.mysql',#數(shù)據(jù)庫引擎'HOST':'',#數(shù)據(jù)庫主機(jī)名'PORT':3306,#數(shù)據(jù)庫端口號'USER':'root',#數(shù)據(jù)庫用戶名'PASSWORD':'123456',#數(shù)據(jù)庫密碼'NAME':'heima'#數(shù)據(jù)庫名}}1.生成遷移16.2.1模型簡介(2)chapter16項(xiàng)目中使用了MySQL數(shù)據(jù)庫以后,還需要確保當(dāng)前的開發(fā)環(huán)境中已經(jīng)安裝了MySQLdb模塊,用于連接MySQL數(shù)據(jù)庫。由于虛擬環(huán)境first_env中還沒有MySQLdb模塊,所以這里還需要在虛擬環(huán)境中安裝該模塊,具體安裝命令及其運(yùn)行結(jié)果如下所示。(first_env)E:\env_space\chapter16>pipinstallmysqlclient==2.2.0……Installingcollectedpackages:mysqlclientSuccessfullyinstalledmysqlclient-2.2.01.生成遷移16.2.1模型簡介(3)Django本身并沒有提供創(chuàng)建數(shù)據(jù)庫的功能,為了能保證chapter16項(xiàng)目能夠正常連接到名稱為heima數(shù)據(jù)庫,這里需要通過其他方式提前創(chuàng)建該數(shù)據(jù)庫,這里使用MySQL命令的方式創(chuàng)建數(shù)據(jù)庫。以管理員身份打開命令行窗口中,在該窗口中通過命令切換到D:\programs\mysql-8.0.34-winx64\bin目錄下登錄MySQL,登錄成功后在提示符后面輸入創(chuàng)建數(shù)據(jù)庫heima的命令,具體命令及其運(yùn)行結(jié)果如下所示:1.生成遷移createdatabaseheimacharset=utf8;命令格式16.2.1模型簡介(3)打開另一個(gè)命令行窗口,在虛擬環(huán)境first_env中切換至chapter16項(xiàng)目的根目錄,在根目錄下執(zhí)行生成遷移文件的命令,生成遷移文件命令如下。1.生成遷移pythonmanage.pymakemigrations命令格式16.2.1模型簡介遷移文件生成之后,需要使用執(zhí)行遷移文件命令生成對應(yīng)的數(shù)據(jù)表。執(zhí)行遷移文件的命令具體如下:2.執(zhí)行遷移文件pythonmanage.pymigrate命令格式執(zhí)行上述命令后,命令行窗口中會顯示一些遷移操作執(zhí)行過程的提示信息,執(zhí)行成功后會在數(shù)據(jù)庫中會生成會以“應(yīng)用名_模型類名(小寫)”形式命名的數(shù)據(jù)表,比如app03應(yīng)用下定義模型類BookInfo,會在heima數(shù)據(jù)庫中生成數(shù)據(jù)表app03_bookinfo。

先定一個(gè)小目標(biāo)!熟悉模型的字段,能夠歸納常見字段的功能16.2.2模型的字段模型的字段16.2.2模型的字段字段是Django模型的重要組成部分,每個(gè)模型類的字段對應(yīng)數(shù)據(jù)表中的一個(gè)字段。模型字段是模型類的屬性,它自身也是一個(gè)類。模型中的字段分為字段類型和關(guān)系字段,字段類型用于定義字段的數(shù)據(jù)類型;關(guān)系字段用于定義模型之間的關(guān)聯(lián)關(guān)系。1.字段類型16.2.2模型的字段在Django中,字段類型指的是在定義模型時(shí),用于描述數(shù)據(jù)表中字段類型的類。Django內(nèi)置了許多字段類,用于表示不同種類的數(shù)據(jù)。字段類說明AutoField用于定義可自增的整數(shù)字段BigAutoField用于表示一個(gè)可自增的大整數(shù)字段BooleanField用于定義布爾類型的字段,值為True或FalseCharField用于定義字符串類型的字段DateField用于定義格式為YYYY-mm-dd的表示日期字段FileField用于上傳文件的字段,該字段不能作為主鍵ImageField用于上傳圖片類型文件,繼承FileField,包含F(xiàn)ileField字段的全部參數(shù)IntegerField用于定義整型字段,取值范圍為-231~231-1TextField用于定義大文本字段2.關(guān)系字段16.2.2模型的字段關(guān)系型數(shù)據(jù)庫不僅定義了數(shù)據(jù)的組織形式,還定義了表間的關(guān)系,因此Django中的模型除了要定義表示數(shù)據(jù)類型的字段,還需要定義表間關(guān)系。數(shù)據(jù)庫表之間的關(guān)系分為一對多、一對一和多對多三種,Django使用ForeignKey、OneToOneField和ManyToManyField關(guān)系字段類來定義這三種關(guān)系。ForeignKey16.2.2模型的字段ForeignKey用于定義一對多關(guān)系,它包含兩個(gè)必選參數(shù)to、on_delete,其中參數(shù)to指定與之關(guān)聯(lián)的模型;參數(shù)on_delete用于設(shè)置關(guān)聯(lián)對象刪除后當(dāng)前對象的處理方式,它的默認(rèn)值為models.CASCADE,表示級聯(lián)刪除,也就是說刪除主表中記錄的同時(shí)也刪除關(guān)聯(lián)表中相關(guān)的記錄。在定義一對多關(guān)系時(shí),需要將ForeignKey字段定義在處于“多”的一端的模型類中。以國家和城市為例,一個(gè)國家包含多個(gè)城市,國家和城市之間具有一對多關(guān)系,F(xiàn)oreginKey應(yīng)該定義在表示城市的模型類中。示例如下:fromdjango.dbimportmodelsclassCountry(models.Model): country_code=models.CharField(max_length=20)country_name=models.CharField(max_length=50)classCity(models.Model):city_name=models.CharField(max_length=20)city_area=models.IntegerField(default=0)city_nation=models.ForeignKey(Country,on_delete=models.CASCADE)16.2.2模型的字段ForeignKey16.2.2模型的字段OneToOneFieldOneToOneField用來定義一對一關(guān)系,它繼承了ForeignKey,使用方式與ForeignKey類似。與ForeignKey不同的是,OneToOneField需要添加一個(gè)位置選項(xiàng)來指定與關(guān)聯(lián)模型的關(guān)系。在定義一對一關(guān)系時(shí),可將OneToOneField字段定義在任意模型類中。以國家和總統(tǒng)為例,一個(gè)國家只能有一個(gè)總統(tǒng),一個(gè)總統(tǒng)也只能屬于一個(gè)國家,將OneToOneField定義在表示總統(tǒng)的模型類中,示例如下:classPresident(models.Model):president_name=models.CharField(max_length=20)president_gender=models.CharField(max_length=10)president_nation=models.OneToOneField(Country)16.2.2模型的字段OneToOneField16.2.2模型的字段ManyToManyFieldManyToManyField用來定義多對多關(guān)系,它需要一個(gè)必選位置參數(shù)to,用于指定與當(dāng)前模型關(guān)聯(lián)的模型。與定義一對一關(guān)系類似,在定義多對多關(guān)系時(shí),可將ManyToManyField字段定義在任意模型類中。以教師和學(xué)生為例,多位教師可以對應(yīng)多名學(xué)生,定義具有多對多關(guān)系的教師表和學(xué)生表,示例如下:classTeachers(models.Model):name=models.CharField(max_length=10)classStudents(models.Model):name=models.CharField(max_length=10)classes=models.ManyToManyField(Teachers)16.2.2模型的字段ManyToManyField16.2.2模型的字段3.字段通用參數(shù)字段的一些參數(shù)為該字段的特有參數(shù),但還有一些參數(shù)為多個(gè)字段的通用參數(shù),常見的字段通用參數(shù)如表所示。參數(shù)說明null指定字段的數(shù)據(jù)庫存儲值是否可以為NULL,默認(rèn)值是Falsedefault指定字段的默認(rèn)值,默認(rèn)值不能是模型實(shí)例、列表、集合等可變對象blank指定字段是否可以為空白,默認(rèn)值是Falsechoices用于限制字段的值必須來自特定的預(yù)定義選項(xiàng)列表primary_key指定模型中的字段是否是主鍵,默認(rèn)值是False,一般作為AutoField的參數(shù)使用unique指定字段在表中是否唯一,默認(rèn)值是False

先定一個(gè)小目標(biāo)!掌握數(shù)據(jù)的增刪改查操作,能夠通過objects管理器實(shí)現(xiàn)添加、查詢、更新和刪除數(shù)據(jù)的功能16.2.3數(shù)據(jù)的增刪改查數(shù)據(jù)的增刪改查Django為每個(gè)模型類添加一個(gè)名為objects的管理器(Manager),管理器提供了許多用于數(shù)據(jù)庫查詢和操作的方法。通過

objects

管理器可以執(zhí)行各種數(shù)據(jù)庫操作,基本操作包括添加數(shù)據(jù)、查詢數(shù)據(jù)、更新數(shù)據(jù)和刪除數(shù)據(jù)等。16.2.3數(shù)據(jù)的增刪改查1.添加數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查向數(shù)據(jù)表中添加數(shù)據(jù)有兩種方式,一種方式是使用管理器的create()方法添加數(shù)據(jù),另一種方式是使用模型實(shí)例的save()方法添加數(shù)據(jù),關(guān)于它們的介紹如下。(1)使用管理器的create()方法添加數(shù)據(jù)create()是模型類管理器提供的方法,用于創(chuàng)建一個(gè)模型類對象,并將該對象保存至數(shù)據(jù)庫中,實(shí)現(xiàn)添加數(shù)據(jù)的效果,其語法格式如下:create(self,**kwargs)語法格式**kwargs:參數(shù)需要接收一個(gè)或多個(gè)以關(guān)鍵字參數(shù)的方式傳遞的字段,其中關(guān)鍵字參數(shù)的名稱為字段名,值為字段對應(yīng)的值。1.添加數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查導(dǎo)入app03.models的模型類,使用模型類BookInfo管理器的create()方法添加數(shù)據(jù),具體代碼及其運(yùn)行結(jié)果如下所示:>>>fromapp03.modelsimport*>>>BookInfo.objects.create(name="駱駝祥子",read_count=100,...pub_date="1937-1-2",is_delete=0,comment_count=70)<BookInfo:駱駝祥子>1.添加數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查(2)使用模型實(shí)例的save()方法添加數(shù)據(jù)save()方法是模型實(shí)例的方法,用于將模型實(shí)例中的數(shù)據(jù)添加到數(shù)據(jù)庫中,其語法格式如下:save(force_insert=False,force_update=False,using=None,update_fields=None)語法格式force_insert:表示強(qiáng)制執(zhí)行插入語句,不可與force_update同時(shí)使用。force_update:表示強(qiáng)制執(zhí)行更新語句,不可與force_insert同時(shí)使用。using:用于將數(shù)據(jù)保存到指定的數(shù)據(jù)庫。update_fields:用于指定更新的字段,其余的字段不更新。1.添加數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查例如,創(chuàng)建模型類BookInfo的實(shí)例,通過該實(shí)例調(diào)用save()方法添加數(shù)據(jù),具體代碼如下所示:>>>bookinfo=BookInfo(name='圍城',pub_date='1994-02-05',...read_count=134,comment_count=100,is_delete=0)>>>bookinfo.save()2.查詢數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查管理器提供了四個(gè)查詢數(shù)據(jù)的方法:all()、filter()、exclude()和get()。16.2.3數(shù)據(jù)的增刪改查(1)all()方法all()方法用于查詢模型在數(shù)據(jù)庫映射的表中的所有記錄,返回值是一個(gè)QuerySet對象,該對象是一個(gè)類似列表的結(jié)構(gòu),它支持for循環(huán)、正索引、切片等操作。例如,使用all()方法查詢模型類BookInfo所對應(yīng)數(shù)據(jù)表中的所有記錄,具體代碼及其運(yùn)行結(jié)果如下所示:>>>all_book=BookInfo.objects.all()>>>all_book<QuerySet[<BookInfo:駱駝祥子>,<BookInfo:圍城>]>2.查詢數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查(2)filter()方法filter()方法用于根據(jù)查詢條件查詢數(shù)據(jù)表,查詢條件的基本形式為“字段名稱__運(yùn)算符=值”,篩選出滿足條件的數(shù)據(jù),并返回一個(gè)QuerySet對象。例如,使用filter()方法查詢id值小于2的記錄,具體代碼及其運(yùn)行結(jié)果如下所示:>>>filter_book=BookInfo.objects.filter(id__lt=2)>>>filter_book<QuerySet[<BookInfo:駱駝祥子>]>2.查詢數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查2.查詢數(shù)據(jù)常見的運(yùn)算符如表所示。運(yùn)算符說明gt判斷字段值是否大于給定的值gte判斷字段值是否大于等于給定的值lt判斷字段值是否小于給定的值lte判斷字段值是否小于等于給定的值in判斷字段值是否存在于一個(gè)可迭代列表中range判斷字段值是否在指定的區(qū)間中exact判斷字段值是否精確相等16.2.3數(shù)據(jù)的增刪改查2.查詢數(shù)據(jù)常見的運(yùn)算符如表所示。運(yùn)算符說明iexact判斷字段值是否精確相等,忽略大小寫contains字段值的模糊匹配icontains字段值的模糊匹配,忽略大寫startswith判斷字段值是否以特定字符串開頭istartswith判斷字段值是否以特定字符串開頭,忽略大小寫endswith判斷字段值是否以特定字符串結(jié)尾iendswith判斷字段值是否以特定字符串結(jié)尾,忽略大小寫16.2.3數(shù)據(jù)的增刪改查(3)exclude()方法exclude()方法用于根據(jù)查詢條件查詢數(shù)據(jù)表,篩選出不滿足條件的數(shù)據(jù),并返回一個(gè)QuerySet對象。例如,使用exclude()方法查詢id小于3的記錄,具體代碼及其運(yùn)行結(jié)果如下所示:>>>exclude_book=BookInfo.objects.exclude(id__gte=3)>>>exclude_book<QuerySet[<BookInfo:駱駝祥子>,<BookInfo:圍城>]>2.查詢數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查(4)get()方法get()方法用于根據(jù)查詢條件進(jìn)行查找,篩選出符合條件的一條記錄,返回值是一個(gè)模型實(shí)例。例如,使用get()方法查詢數(shù)據(jù)表books_bookinfo中id值為1的記錄,具體代碼及其運(yùn)行結(jié)果如下所示:>>>get_book=BookInfo.objects.get(id=1)>>>get_book<BookInfo:駱駝祥子>2.查詢數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查delete()方法用于從數(shù)據(jù)表中刪除數(shù)據(jù),對應(yīng)SQL中的刪除操作,此方法會立即刪除數(shù)據(jù)庫中的記錄,并返回刪除記錄的數(shù)量。例如,使用delete()方法從數(shù)據(jù)表books_bookinfo中刪除記錄get_book,具體代碼及其運(yùn)行結(jié)果如下所示:>>>get_book.delete()(1,{'app03.BookInfo':1})3.刪除數(shù)據(jù)16.2.3數(shù)據(jù)的增刪改查update()方法是QuerySet對象提供的方法,該方法將滿足查詢條件的記錄的指定字段更新為新值,并返回被更新的記錄數(shù)量。update()方法需要接收一個(gè)或多個(gè)關(guān)鍵字參數(shù),用于指定要更新的字段和對應(yīng)的新值。例如,將數(shù)據(jù)表中id為2的記錄中is_delete字段的值修改為1,具體代碼及其運(yùn)行結(jié)果如下所示:>>>update_book=BookInfo.objects.filter(id=2).update(is_delete=1)>>>update_book14.更新數(shù)據(jù)模板16.3

先定一個(gè)小目標(biāo)!掌握模板的配置,能夠在項(xiàng)目中使用配置的模板16.3.1模板簡介模板簡介Django的模板是一個(gè)文本文件,這個(gè)文件可以是任何類型的,比如HTML文件、CSV文件、XML文件等,通常使用HTML文件作為模板。模板中可以定義網(wǎng)頁的靜態(tài)部分和動態(tài)部分,其中靜態(tài)部分指的是HTML結(jié)構(gòu)和布局,不受數(shù)據(jù)的影響;動態(tài)部分指的是嵌套在某個(gè)位置的模板語法,通過模板語法,可以將視圖傳遞過來的數(shù)據(jù)動態(tài)地插入到模板中,并對數(shù)據(jù)進(jìn)行處理和格式化,實(shí)現(xiàn)根據(jù)數(shù)據(jù)動態(tài)生成網(wǎng)頁內(nèi)容的目的。16.3.1模板簡介模板簡介Django項(xiàng)目通過模板引擎渲染模板,渲染模板其實(shí)是將模板文件與具體的數(shù)據(jù)結(jié)合起來,生成最終網(wǎng)頁內(nèi)容的過程。在這個(gè)過程中,模板引擎會解析模板文件,識別其中的靜態(tài)部分,同時(shí)處理模板中的模板語法,并會根據(jù)視圖函數(shù)傳遞的數(shù)據(jù)將模板語法替換為實(shí)際的內(nèi)容。Django項(xiàng)目中可以配置一個(gè)或多個(gè)模板引擎。Django有內(nèi)置的模板引擎,同時(shí)也支持廣泛使用的Python模板引擎Jinja2。16.3.1模板簡介若要在Django項(xiàng)目中使用模板,需要在settings.py文件的配置項(xiàng)TEMPLATES中提前配置模板引擎。TEMPLATES的值是一個(gè)列表,列表里面的每個(gè)元素對應(yīng)一個(gè)引擎的配置。例如,chapter16項(xiàng)目中settings.py文件的配置項(xiàng)TEMPLATES默認(rèn)代碼如下所示:TEMPLATES=[{"BACKEND":"django.template.backends.django.DjangoTemplates","DIRS":[],"APP_DIRS":True,"OPTIONS":{"context_processors":[……],},},]16.3.1模板簡介模板簡介一個(gè)引擎通常需要指定四項(xiàng)信息:BACKEND、DIRS、APP_DIRS、OPTIONS,關(guān)于這四項(xiàng)信息的含義說明如下。(1)BACKEND:指定用于實(shí)現(xiàn)Django模板引擎API的模板引擎類的路徑。Django內(nèi)置模板引擎DjangoTemplates和Jinja2的路徑分別為django.template.backends.django.DjangoTemplates和django.template.backends.jinja2.Jinja2。(2)DIRS:用于設(shè)置模板源文件的目錄列表,模板引擎將按列表中元素的順序依次查找目錄中的模板文件。默認(rèn)情況下,Django約定在項(xiàng)目根目錄下的templates文件夾中查找模板文件,此文件夾需要用戶單獨(dú)創(chuàng)建,此時(shí)需要先導(dǎo)入os模塊,再在目錄列表中增加一個(gè)元素為os.path.join(BASE_DIR,'templates')。16.3.1模板簡介模板簡介一個(gè)引擎通常需要指定四項(xiàng)信息:BACKEND、DIRS、APP_DIRS、OPTIONS,關(guān)于這四項(xiàng)信息的含義說明如下。(3)APP_DIRS:聲明是否在已安裝的應(yīng)用程序中查找模板,默認(rèn)值為True。(4)OPTIONS:模板引擎的選項(xiàng)信息,它的值是一個(gè)字典,字典中可以包含多個(gè)鍵值對,用于指定模板引擎的各種選項(xiàng)。比如,content_processors用于指定上下文處理器列表,在渲染模板時(shí)將處理器中的數(shù)據(jù)添加到模板上下文中。16.3.1模板簡介模板簡介無論使用哪個(gè)模板引擎,Django都會采用統(tǒng)一的標(biāo)準(zhǔn)加載和渲染模板,加載模板的函數(shù)是get_template()和selsect_template(),它們被定義在django.template.loader模塊中,其語法格式如下:16.3.1模板簡介模板簡介get_template()函數(shù)接收模板名稱,返回Template對象;select_template()函數(shù)接收一個(gè)模板名稱列表,它會按照順序嘗試加載列表中的模板,返回找到的第一個(gè)模板的Template對象。若沒有找到模板,這兩個(gè)方法都拋出TemplateDoesNotExist異常;若找到的模板中存在語法錯(cuò)誤,則拋出TemplateSyntaxError異常。get_template()和select_template()函數(shù)的參數(shù)using是可選參數(shù),用于接收模板引擎的名稱,限定搜索時(shí)使用的模板引擎。get_template(template_name,using=None)select_template(template_name_list,using=None)語法格式get_template()和select_template()函數(shù)都會生成Template對象,該對象中提供了render()方法用于渲染模板。render()方法的語法格式如下:16.3.1模板簡介模板簡介context:表示要傳遞給模板的上下文數(shù)據(jù),它的值是一個(gè)字典,字典的內(nèi)容為在模板中使用的變量及其對應(yīng)的值,可以為空。request:表示請求對象,它的值是一個(gè)HttpRequest對象。render()方法會返回一個(gè)字符串,表示成功渲染模板后的結(jié)果。render(context=None,request=None)語法格式

先定一個(gè)小目標(biāo)!掌握模板,能夠在項(xiàng)目中使用模板以及語法規(guī)則16.3.2模板語法模板語法模板文件包含靜態(tài)部分和描述數(shù)據(jù)如何插入HTML的動態(tài)部分,模板語言分變量(variables)和標(biāo)簽(tags)兩部分定義了這些動態(tài)內(nèi)容的語法,此外,Django為變量定義了過濾器(filter),也支持自定義過濾器,以便模板可以呈現(xiàn)更加靈活的數(shù)據(jù)。16.3.2模板語法variable表示模板變量的名稱,由字母、數(shù)字和下畫線組成,但不能以下畫線開頭。16.3.2模板語法1.變量{{variable}}語法格式模板語言中的變量用于標(biāo)識模板中會動態(tài)變化的數(shù)據(jù),當(dāng)模板被渲染時(shí),模板引擎將變量替換為視圖傳遞過來的真實(shí)數(shù)據(jù)。模板變量的基本語法格式如下:16.3.2模板語法1.變量通過點(diǎn)字符進(jìn)一步訪問變量中的數(shù)據(jù),但由于模板不明確模板變量的類型,因此模板引擎會按以下順序進(jìn)行嘗試。(1)將變量視為字典,嘗試根據(jù)鍵訪問其對應(yīng)的值。(2)將變量視為對象,嘗試訪問對象的屬性或方法。(3)嘗試訪問變量的索引。需要注意的是,若點(diǎn)字符后面是一個(gè)方法,則這個(gè)方法在被調(diào)用時(shí)不需要帶括號。例如調(diào)用字典類型的變量books的items()方法,具體代碼如下:{{books.items}}若變量不存在,則模板引擎將以string_if_invalid選項(xiàng)的值替換該變量,默認(rèn)值為空字符串,這樣可以保證模板在遇到不存在的變量時(shí)能夠正常渲染。16.3.2模板語法2.過濾器{{variables|filters}}語法格式過濾器用于對變量進(jìn)行處理和格式化,基本語法格式如下:variable表示模板變量的名稱,filters表示過濾器,它們之間使用管道符號“|”連接。需要注意的是,管道符號和變量、過濾器之間不能有空格。還可以使用多個(gè)管道符號連接多個(gè)過濾器,連續(xù)對同一變量進(jìn)行過濾,其語法格式如下。{{variables|filters1|filters2|...}}語法格式一些過濾器可以接收參數(shù),過濾器與參數(shù)之間使用“:”分隔。若參數(shù)中含有空格,則參數(shù)必須放在引號之內(nèi),例如{{list|join:","}}。(1)addadd用于將過濾器的參數(shù)與變量的值進(jìn)行相加操作,示例如下:16.3.2模板語法2.過濾器{{value|add:"32"}}當(dāng)變量value的值為3時(shí),則結(jié)果是35。add過濾器首先嘗試將變量和參數(shù)都強(qiáng)制轉(zhuǎn)換為整數(shù),若轉(zhuǎn)換失敗,add會連接變量與參數(shù)。示例如下:{{first|add:second}}假設(shè)first值為[1,2,3],second的值為[4,5,6],則輸出結(jié)果為[1,2,3,4,5,6]。需要注意的是,連接變量和參數(shù)的操作只適用于字符串或列表這種類型的數(shù)據(jù),若為其它類型的數(shù)據(jù),則會返回空字符串。(2)centercenter用于指定寬度,使變量的值居中顯示,并在兩側(cè)填充指定的字符。示例如下:16.3.2模板語法2.過濾器{{value|center:"18"}}假設(shè)value的值為“itcast”,結(jié)果為“itcast”。(3)defaultdefault用于指定變量的默認(rèn)值。如果變量未定義或者為空,則返回默認(rèn)值。示例如下:{{value|default:"35"}}假設(shè)value的值為“”,則結(jié)果為“35”。(4)joinjoin用于將列表的所有元素以指定的分隔符連接成一個(gè)字符串。示例如下:16.3.2模板語法2.過濾器{{value|join:"http://"}}假設(shè)value的值為[1,2,3],則結(jié)果將是字符串“1//2//3”。(5)lengthlength可返回變量的長度,可用于字符串和列表。示例如下:{{value|length}}假設(shè)value的值為[1,2,3],結(jié)果將是3。標(biāo)簽蘊(yùn)含一定的邏輯,它的功能要比變量復(fù)雜,例如一些標(biāo)簽用于輸出文本;一些標(biāo)簽通過執(zhí)行循環(huán)或邏輯控制流;一些標(biāo)簽加載外部信息到模板中,以供后續(xù)變量的使用。標(biāo)簽格式簡單,采用{%tag%}的形式進(jìn)行標(biāo)識;但也有一些標(biāo)簽必須成對出現(xiàn),用于標(biāo)識模板文本的開始和結(jié)束,示例格式如下:16.3.2模板語法3.標(biāo)簽{%tag%}...{%endtag%}示例(1)for循環(huán)遍歷數(shù)組中的每個(gè)元素,以便在上下文變量中使用這些元素。模板語言中for的用法與Python中的for相同。例如,使用for標(biāo)簽遍歷書單book_list,并輸出所有書名,示例代碼如下:16.3.2模板語法3.標(biāo)簽{%forbookinbook_list%}<li>{{}}</li>{%endfor%}模板中的for支持反向遍歷列表,語法格式如下:16.3.2模板語法3.標(biāo)簽{%forobjinlistreversed%}語法格式若要遍歷雙層列表,可以解包內(nèi)層列表中的每個(gè)元素到多個(gè)變量中。例如,列表points中的每個(gè)元素都是[x,y]形式的坐標(biāo),輸出每一個(gè)坐標(biāo)的x、y值,示例代碼如下:{%forx,yinpoints%}Thereisapointat{{x}},{{y}}{%endfor%}需要注意的是,操作符“.”查找優(yōu)先于方法查找,因此若字典中包含鍵items,data.items將返回data[‘items’]而非data.items()。如果想在模板中使用字典的方法,如items、values、keys等,需避免使用字典的方法名作為鍵名。16.3.2模板語法3.標(biāo)簽(2)ifif是條件判斷標(biāo)簽,可以選擇與elif、else搭配使用,它們與Python中關(guān)鍵字if、elif、else的含義相同。若滿足判斷條件,則會顯示相應(yīng)子句中的內(nèi)容。示例代碼如下:16.3.2模板語法3.標(biāo)簽{%ifbook_list%}現(xiàn)有閑余圖書:{{book_list|length}}本{%elifbook_leased_list%}圖書待歸還……{%else%}沒有圖書{%endif%}if標(biāo)簽允許使用邏輯運(yùn)算符and、or或not進(jìn)行布爾測試,允許同一標(biāo)簽中同時(shí)使用and和or,and的優(yōu)先級高于or。示例如下:16.3.2模板語法3.標(biāo)簽{%ifathlete_listandcoach_listorcheerleader_list%}需要注意的是,模板語言的if標(biāo)簽不支持括號,若需明確表示混合語句中子句的優(yōu)先級,應(yīng)使用if嵌套語句。if標(biāo)簽還支持運(yùn)算符==、!=、<、>、<=、>=以及in、notin、is、isnot,示例代碼如下:{%ifsomevar=="x"%}Thisappearsifvariablesomevarequalsthestring"x"{%endif%}示例示例視圖16.4

先定一個(gè)小目標(biāo)!掌握視圖的定義,能夠在Django項(xiàng)目中定義函數(shù)視圖16.4.1視圖簡介視圖簡介視圖用于處理HTTP請求,并返回響應(yīng)。視圖的功能決定了它的基本結(jié)構(gòu),具體如下:defview_name(request,*arg=None,**kwargs=None):代碼段returnHttpResponse(response)語法格式16.4.1視圖簡介使用以上結(jié)構(gòu)可以定義一個(gè)基本視圖,顯然這個(gè)視圖本質(zhì)上是一個(gè)Python函數(shù)。在上述結(jié)構(gòu)中,view_name表示視圖名稱;參數(shù)request是必選參數(shù),用于接收請求對象,即HttpRequest類的實(shí)例;參數(shù)args和kwargs為可選參數(shù),用于接收URL中的額外參數(shù);返回值用于返回響應(yīng)對象,即HttpResponse類或其子類的實(shí)例。在app03應(yīng)用的views.py文件中定義一個(gè)視圖curr_time(),用于返回當(dāng)前日期和時(shí)間,具體代碼如下:(1)若要修改視圖返回的頁面樣式,必須修改Python代碼。(2)若頁面內(nèi)容較多,視圖中的代碼會變得非常臃腫。importtimedefcurr_time(request):current_time=time.time()local_time=time.localtime(current_time)now=time.strftime("%Y-%m-%d%H:%M:%S",local_time)response="<html><body>當(dāng)前時(shí)間:%s</body></html>"%nowreturnHttpResponse(response)16.4.1視圖簡介視圖簡介Django提倡將頁面樣式放在模板文件之中,在視圖文件中使用字典向模板傳遞數(shù)據(jù)。提取視圖curr_time()中的樣式代碼,將這些樣式代碼全部放在新創(chuàng)建的time.html文件中,示例代碼如下:模板的變量now表示當(dāng)前時(shí)間,它接收從視圖函數(shù)中傳來的數(shù)據(jù)。下面修改views.py文件中視圖函數(shù)的代碼。<head><metacharset="UTF-8"><title>當(dāng)前時(shí)間</title></head><body>當(dāng)前時(shí)間:{{now}}</body>16.4.1視圖簡介視圖簡介修改views.py文件中視圖函數(shù)的代碼,修改后的代碼如下:importtimedefcurr_time(request):current_time=time.time()

#獲取當(dāng)前時(shí)間local_time=time.localtime(current_time)now=time.strftime("%Y-%m-%d%H:%M:%S",local_time)context={'now':now}#上下文數(shù)據(jù)temp_obj=get_template("time.html")response=temp_obj.render(request=request,context=context)

#渲染模板,指定上下文數(shù)據(jù)returnHttpResponse(response)16.4.1視圖簡介視圖簡介

先定一個(gè)小目標(biāo)!熟悉視圖,能夠歸納請求對象的常見屬性和方法16.4.2請求對象請求對象16.4.2請求對象請求對象由Django自動創(chuàng)建,并由視圖的request參數(shù)接收。Django項(xiàng)目中,幾乎所有請求的處理都離不開請求對象。請求對象是HttpRequest類的實(shí)例,它封裝了HTTP請求的所有信息。我們可以使用HttpRequest類定義的屬性和方法訪問與HTTP請求相關(guān)的信息。HttpRequest對象提供了很多屬性,這些屬性可以方便用戶獲取HTTP請求的各種信息,包括請求體、請求方法、請求資源的路徑部分等。HttpRequest對象的常用屬性如表所示。16.4.2請求對象HttpRequest的常用對象屬性說明body用于獲取原始HTTP請求的請求體信息,獲取的結(jié)果是字節(jié)類型的數(shù)據(jù)path用于獲取請求的路徑部分,不包括域名和參數(shù)method用于獲取本次HTTP請求所用的請求方法,常用在根據(jù)不同請求方法執(zhí)行不同邏輯的場景GET獲取包含GET請求參數(shù)的QueryDict對象POST獲取包含POST請求參數(shù)的QueryDict對象COOKIES獲取包含請求中的cookie信息的字典對象META獲取包含請求頭的字典對象(1)GET屬性GET屬性用于獲取包含GET請求的所有參數(shù),它的值是一個(gè)QueryDict對象。QueryDict對象與普通字典的功能類似,但它具有一些額外的功能和特性。若要獲取特定參數(shù)的值,則可以使用QueryDict對象的get()方法進(jìn)行獲取。例如,通過request.GET.get(‘name’)獲取參數(shù)name對應(yīng)的值。(2)POST屬性POST屬性用于獲取包含POST請求的所有參數(shù),它的值是一個(gè)QueryDict對象。需要注意的是,如果用戶以POST方式提交表單請求,但表單中沒有數(shù)據(jù)時(shí),服務(wù)器收到的POST請求將為空。因此,在判斷是否使用了POST方法時(shí),不能使用“ifrequest.POST”,而應(yīng)使用“ifrequest.method=='POST'”進(jìn)行判斷。16.4.2請求對象HttpRequest的常用對象(3)META屬性META屬性用于獲取包含HTTP請求頭信息,該屬性的值是一個(gè)字典,可以通過特定的鍵來訪問其對應(yīng)的值,以查看請求的各種附加信息,常用的鍵具體如下。CONTENT_LENGTH:請求正文的長度,按字符串類型計(jì)算。CONTENT_TYPE:請求正文的MIME類型。HTTP_REFERER:HTTP請求的來源頁面的URL。HTTP_ACCEPT:可接收的響應(yīng)內(nèi)容類型。HTTP_ACCEPT_ENCODING:可接收的響應(yīng)編碼類型。HTTP_ACCEPT_LANGUAGE:可接收的響應(yīng)語言類型。HTTP_HOST:客戶端發(fā)送的HTTP主機(jī)頭部信息。HTTP_USER_AGENT:客戶端的UserAgent字符串。16.4.2請求對象HttpRequest的常用對象HttpRequest對象提供了很多方法,這些方法方便用戶訪問或操作HTTP請求的各種信息,包括獲取請求的主機(jī)名、獲取請求的端口號等。HttpRequest對象的常用方法如表所示。16.4.2請求對象HttpRequest的常用方法屬性說明get_host()根據(jù)META屬性中特定鍵HTTP_X_FORWARDED和HTTP_HOST的值,按順序返回發(fā)起請求的原始主機(jī)名get_port()根據(jù)META屬性中特定鍵HTTP_X_FORWARDED_PORT和SERVER_PORT的值順序返回發(fā)起請求的端口號get_full_path()獲取完整的請求路徑,包括查詢參數(shù)build_absolute_uri()根據(jù)HttpRequest對象中的相關(guān)信息構(gòu)建一個(gè)絕對URLget_signed_cookie()用于獲取已簽名的Cookie的值,若簽名不合法,則返回django.core.signing.BadSignture

先定一個(gè)小目標(biāo)!16.4.3響應(yīng)對象熟悉視圖,能夠歸納響應(yīng)對象的常見屬性和方法1.HttpResponse的常用屬性HttpResponse對象提供了很多屬性,通過這些屬性用戶可以方便地設(shè)置HTTP響應(yīng)的各種信息,包括響應(yīng)狀態(tài)碼、內(nèi)容、字符編碼等。16.4.3響應(yīng)對象16.4.3響應(yīng)對象1.HttpResponse的常用屬性HttpResponse對象的常用屬性如表所示。屬性說明content用于設(shè)置響應(yīng)消息的內(nèi)容,值為字節(jié)類型的數(shù)據(jù)charset用于設(shè)置響應(yīng)消息的字符編碼方式。若不設(shè)置,Django將通過解析content_type獲取編碼方式;若解析失敗,則使用默認(rèn)值DEFAULT_CHARSETstatus_code用于設(shè)置響應(yīng)的HTTP狀態(tài)碼reason_phrase用于獲取與HTTP狀態(tài)碼對應(yīng)的原因短語。除非明確設(shè)置該屬性,否則該屬性將通過status_code的值確定HttpResponse對象提供了很多方法,這些方法可以方便用戶訪問或操作HTTP響應(yīng)的各種信息,包括設(shè)置Cookie信息、刪除Cookie信息等。下面對一些常用方法進(jìn)行介紹。(1)__init__()方法:__init__()是HttpResponse類的構(gòu)造方法,該方法

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論