django 自定義模板標籤和過濾器

2021-07-09 13:46:41 字數 3293 閱讀 7605

django 自定義模板標籤和過濾器

1.建立乙個模板庫

books/ 

__init__.py 

models.py 

templatetags/ 

views.py 

在 templatetags 中建立兩個空檔案:乙個 __init__.py (告訴python這是乙個包含了python**的包)和乙個用來存放你自定義的標籤/過濾器定義的檔案。第二個檔案的名字稍後將用來載入標籤。例如,如果你的自定義標籤/過濾器在乙個叫作 poll_extras.py 的檔案中,你需要在模板中寫入如下內容:

要成為有效的標籤庫,模組必須包含乙個模組級的變數: register ,這是乙個 template.library 的例項。這個 template.library 例項是包含所有已註冊的標籤及過濾器的資料結構。因此,在模組的頂部位置插入下述**:

from django import template 

register = template.library() 

2. 自定義模板過濾器 

自定義過濾器就是有乙個或兩個引數的python函式::

例如,在過濾器 } 中 ,過濾器 foo 會被傳入變數 var 和引數 bar 的內容。 

過濾器函式應該總有返回值,而且不能觸發異常,它們都應該靜靜的失敗。如果有乙個錯誤發生,它們要麼返回原始的輸入字串,要麼返回空的字串,無論哪個都可以。 

1)這裡是一些定義過濾器的例子: 

def cut(value, arg): 

"removes all values of arg from the given string" 

return value.replace(arg, '') 

def lower(value): # only one argument. 

"converts a string into all lowercase" 

return value.lower() 

2)這裡是一些如何使用過濾器的例子: 

} 3)下面是乙個完整的模板庫的例子,提供了乙個 cut 過濾器: 

from django import template 

register = template.library() 

@register.filter(name='cut') (裝飾器)

def cut(value, arg): 

return value.replace(arg, '') 

@register.filter 

def lower(value): 

return value.lower() 

注意:1)在定義過濾器時,需要用 library 例項來註冊它,這樣就能通過django的模板語言來使用了: python 2.4或更新,可以通過上面的裝飾器   實現,如果不使用 name 引數,@register.filter那麼django將會使用函式名作為過濾器的名字

3. 自定義模板標籤 

(1)定義標籤 

the time is . 

(2)編寫模板標籤分析器mytag.py 

from django import template 

def do_current_time(parser, token): 

try: 

# split_contents() knows not to split quoted strings. 

tag_name, format_string = token.split_contents() 

except valueerror: 

msg = '%r tag requires a single argument' % token.contents()[0] 

raise template.templatesyntaxerror(msg) 

return currenttimenode(format_string[1:-1]) 

(3) 編寫模板節點 

import datetime 

class currenttimenode(template.node): 

def __init__(self, format_string): 

self.format_string = format_string 

def render(self, context): 

now = datetime.datetime.now() 

return now.strftime(str(self.format_string)) 

(4) 註冊標籤 

register = template.library() 

register.tag(』current_time』, do_current_time) 

或 @register.tag(name=」current_time」) 

def do_current_time(parser, token): 

# … 

(4) 簡單標籤的快捷方式 

django 提供了乙個幫助函式: ******_tag 。這個函式是 django.template.library 的乙個方法,它接受乙個只有乙個引數的函式作引數,把它包裝在 render 函式和之前提及過的其他的必要單位中,然後通過模板系統註冊標籤。

我們之前的的 current_time 函式於是可以寫成這樣: 

def current_time(format_string): 

return datetime.datetime.now().strftime(format_string) 

register.******_tag(current_time) 

在python 2.4中,也可以使用修飾語法: 

@register.******_tag 

def current_time(token): 

… 有關 ******_tag 輔助函式,需要注意下面一些事情: 

傳遞給我們的函式的只有(單個)引數。 

在我們的函式被呼叫的時候,檢查必需引數個數的工作已經完成了,所以我們不需要再做這個工作。 

引數兩邊的引號(如果有的話)已經被截掉了,所以我們會接收到乙個普通字串。 

5. 包含標籤 

(1)定義標籤 

(2)標籤函式 

@register.inclusion_tag('books/books_for_author.html') 

def show_books_for_author(author): 

books = author.book_set.all() 

return  

(3)標籤模板 

django模板,自定義標籤和filter

注 這悲催的縮排,真是對不起觀眾了,有時間過來修改。自定義標籤大致分為三類 1 非封閉標籤如 2 封閉標籤如 3 inclusion標籤 比如 定義乙個標籤需要做兩方面工作 1 定義編譯函式 2 定義node。編譯函式的作用是將自定義node中的render所需要的引數計算出來,以備使用。比如將自定...

Django入門教程 五 自定義模板標籤和過濾器

3 編寫路由 在urls.py檔案中編寫路由。4 編寫業務邏輯,即檢視函式。5 如何自定義django模板語言的標籤和過濾器 6 在自定義的customtags.py檔案下,編寫乙個進行字串切片的過濾器。from django import template 1 先建立乙個過濾器註冊器,用於註冊自定...

Django 自定義標籤

模版是乙個用django模版語言標記過的python字串。模版可以包含模版標籤和變數。模版標籤是在乙個模版裡起作用的標記。比如,乙個模版標籤可以產生控制結構的內容 if或者for 可以獲取資料庫內容或者訪問其它模版標籤。乙個標籤塊被包圍 變數標籤被 包圍 context是乙個傳遞給模版的key va...