1. 程式人生 > >【django3】Django學習筆記3:Model,Template,View 基本概念

【django3】Django學習筆記3:Model,Template,View 基本概念

轉載:http://www.cnblogs.com/weichsel/archive/2012/10/16/2725554.html,侵權必刪


總體結構
        Django是MTV結構,即:Model, Template, View
        Model:定義資料的儲存格式,並且提供了資料庫訪問的API。
        View:定義那些資料被顯示,是業務邏輯處理模組。
        Template:定義資料如何被顯示。
        Django工程包含工程的配置、及多個APP,每個APP完成相對獨立的功能。在設計中,要儘量保持每個APP的獨立性,以做到APP是即插即用。


各個模組的互動關係
        Django收到HTTP請求後,依次完成下列處理:
        根據URL通過URLConf模組對映到View函式,將HttpRequest物件作為引數傳入。
        在View函式中,獲取HTTP請求的引數,通過Model訪問資料庫,進行業務邏輯運算得到輸出資料。
        然後,載入Template,根據輸出資料生成頁面,將HttpResponse物件返回。


Model
一個類對應於資料庫中的表(Table),類屬性對應於表的欄位(Field)。

從 django.db.models.Model 派生,支援繼承。
要使用一個APP時,需要將該APP的Model新增到工程的 settings.py INSTALLED_APPS 中。

Field的定義
        欄位的型別:指定資料庫表字段的型別,表單預設的Widget,以及校驗條件。
        欄位選項:null, blank, choices, default, unique, primary_key。
        表之間的關係:one-to-one, many-to-many, many-to-one。
Model中可以定義Method,實現下列功能:

新增定製的 "row-level" 功能;

override predefined methods;
定義Model的Business Logic;
定義Raw SQL;

資料庫表查詢

使用QuerySet物件實現多種方式的查詢,Model的objects屬性返回QuerySet物件。
1)基本查詢
all_entries = Entry.objects.all()
part_entries = Entry.objects.all()[:5]
one_entry = Entry.objects.get(pk=1)
2)使用過濾器查詢
Entry.objects.filter(pub_date__year=2006)
Entry.objects.exclude(pub_date__gte=datetime.now())
3)欄位(Field)查詢
該功能等價於SQL中的WHERE,可以對Field指定更細緻的查詢條件。
通過Keyword引數,傳遞給QuerySet物件的get, filter, exclude方法。格式:field__lookuptype=value 。
常用的lookuptype有:
exact
iexact
contains
startswith, endswith
Entry.objects.get(headline__exact="Man bites dog")
Entry.objects.get(headline__contains='Lennon')

QuerySet的特點
多個過濾器可以組成鏈使用;
每次查詢返回的QuerySet物件是獨立儲存;
使用了快取機制;
使用了延遲執行機制;


View
View代表一種應用, 返回被請求的頁面。 View要實現兩個功能:URL的分發處理,定義View函式。
URL分發處理
使用正則表示式定義 URL pattern,建立到View函式的對映關係。 

環境配置
settings.ROOT_URLCONF:定義URL的配置檔案位置;
settings.urlpatterns:定義URL patterns 到View函式的對映關係;
URLpattern 匹配的範圍:
        不包含domain
        不包含GET, POST引數
匹配後的引數作為字串傳入view function
從匹配結果到函式引數
傳送給View函式的第一個引數是HttpRequest物件,正則表示式匹配的內容作為第二個引數傳入。
可以使用Named groups,將匹配的部分作為keyword引數。
格式:(?P<name>pattern)
避免重複定義的機制
view prefix:提取view function的公共字首
Including other URLconf


View函式
接收Web請求,返回Web響應,基本的處理流程是
        收到傳入的HttpRequest引數;
        從HttpRequest中獲得輸入資料;
        進行資料處理,構造Context資料;
        載入Template;
        使用Context資料Render Template;
        返回 HttpResponse;


相關的類
class HttpRequest:通過POST或GET屬性訪問傳入的引數
class HttpResponse:主要派生類有 class HttpResponseRedirect,class HttpResponseNotFound
class UploadedFile
class QueryDict:multiple values for the same key


快捷函式
render
render_to_response
redirect
get_object_or_404
get_list_or_404


Template
Template用於描述資料的表現,不包含業務邏輯處理。Django不是簡單的將Python語言嵌入到HTML程式碼中,而是定義了一套標記,用於實現對HTML中資料的控制。通過變數訪問資料,通過TAG控制Template的處理邏輯。
變數
格式:{{ variable }}
TAG
格式: {% tag %}
常用的有:for/if/block and extends

過濾器功能
格式:{{ name|lower }}
例:{{ value|default:"nothing" }}
常用內建的過濾器:default, length, striptags 


Template繼承
使用block/extend實現。
在父模板中,使用block定義擴充套件點。
在派生模板中,使用extend對擴充套件點進行重新定義。也可以引用父模板中的定義,使用{{ block.super }} 。
-----------------------------


2012.10.16 by Weichsel