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響應,基本的處理流程是

  1. 收到傳入的HttpRequest參數;
  2. 從HttpRequest中獲得輸入數據;
  3. 進行數據處理,構造Context數據;
  4. 加載Template;
  5. 使用Context數據Render Template;
  6. 返回 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章