當遇到乙個模板標籤(template tag)時,模板解析器就會把標籤包含的內容,以及模板解析器自己作程式設計客棧為引數呼叫乙個python函式。 這個函式負責返回乙個和當前模板標籤內容相對應的節點(node)的例項。
例如,寫乙個顯示當前日期的模板標籤:。該標籤會根據引數指定的 strftime 格式(參見:顯示當前時間。首先確定標籤的語法是個好主意。 在這個例子裡,標籤應該這樣使用:
the time is .
注意沒錯, 這個模板標籤是多餘的,django預設的 用更簡單的語法完成了同樣的工作。 這個模板標籤在這裡只是作為乙個例子。
這個函式的分析器會獲取引數並建立乙個 node 物件:
from django import template
register = template.library()
def do_current_time(parser, token):
try:
# split_contents() knows not to split quoted strings.
tag_name, format_string = token.split_contents()
except valueerror:
fbflcxct msg = '%r tag requires a single argument' % token.split_contents()[0]
raise template.templatesyntaxerror(msg)
return currenttimenode(format_string[1:-1www.cppcns.com])
這裡需要說明的地方很多:
每個標籤編譯函式有兩個引數,parser和token。parser是模板解析器物件。 我們在這個例子中並不使用它。 token是正在被解析的語句。
token.contents 是包含有標籤原始內容的字串。 在我們的例子中,它是 'current_time "%y-%m-%d %i:%m %p"' 。
token.split_contents() 方法按空格拆分引數同時保證引號中的字串不拆分。 應該避免使用 token.contents.split() (僅使用python的標準字串拆分)。 它不夠健壯,因為它只是簡單的按照所有空格進行拆分,包括那些引號引起來的字串中的空格。
這個函式可以丟擲 django.template.templatesyntaxerror ,這fbflcxct個異常提供所有語法錯誤的有用資訊。
不要把標籤名稱硬編碼在你的錯誤資訊中,因為這樣會把標籤名稱和你的函式耦合在一起。 token.split_contents()[0]總是記錄標籤的名字,就算標籤沒有任何引數。
這個函式返回乙個 currenttimenode (稍後我們將建立它),它包含了節點需要知道的關於這個標籤的全部資訊。 在這個例子中,它只是傳遞了引數 "%y-%m-%d %i:%m %p" 。模板標籤開頭和結尾的引號使用 format_string[1:-1] 除去。
模板標籤編譯函式 必須 返回乙個 node 子類,返回其它值都是錯的。
本文標題: 在python的django框架中編寫編譯函式
本文位址:
Python 使用Django開發Web框架
django符合mtv架構 django的安裝有兩種方法,具體可參考官網 這裡採用第二種方法,即option 2.get the latest development version,具體如下 dw mon tddba git clone dw mon tddba install cd django...
Python和Web開發之 Django框架 二
上節的內容中寫了一些簡單的入門基礎知識,包括安裝django 在django中建立乙個專案 執行開發伺服器等等內容,這次再介紹一些關於框架的基礎知識,對django多一些了解。學習過python的人一定知道python直譯器的強大之處。對於django而言,shell也存在於框架之中,在框架中pyt...
關於python在Django中分頁的實現
import math 每頁有pn num個物件 每個頁面顯示index number個頁索引 當前pn頁 obj要查詢的模型類 def pages pn num,index number,pn,obj 最大頁數sum page 最小頁數1頁 每頁有pn num個物件 目前是pn頁 pn int p...