總體結構
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