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

1.建立一個模板庫html

使用模板過濾器的時候,直接把過濾器寫在app裏,
例如:在app裏新建一個templatetags的文件夾,這個目錄應當和 models.py 、 views.py 等處於同一層次。例如: 
books/ 
    __init__.py 
    models.py 
    templatetags/ 
    views.py 
在 templatetags 中建立兩個空文件:一個 __init__.py (告訴Python這是一個包含了Python代碼的包)和一個用來存放你自定義的標籤/過濾器定義的文件。第二個文件的名字稍後將用來加載標籤。例如,若是你的自定義標籤/過濾器在一個叫做 poll_extras.py 的文件中,你須要在模板中寫入以下內容: {% load poll_extras %}
{% load %} 標籤檢查 INSTALLED_APPS 中的設置,僅容許加載已安裝的Django應用程序中的模板庫。 
要成爲有效的標籤庫,模塊必須包含一個模塊級的變量: register ,這是一個 template.Library 的實例。這個 template.Library 實例是包含全部已註冊的標籤及過濾器的數據結構。所以,在模塊的頂部位置插入下述代碼:
from django import template 
register = template.Library() django


2. 自定義模板過濾器 
自定義過濾器就是有一個或兩個參數的Python函數::
例如,在過濾器 {{ var|foo:」bar」 }} 中 ,過濾器 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)這裏是一些如何使用過濾器的例子: 
    {{ somevariable|cut:」0″ }} 
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將會使用函數名做爲過濾器的名字
2)保證templatetags在已經INSTALLED_APPS裏面,數據結構


3. 自定義模板標籤 
(1)定義標籤 
The time is {% current_time 「%Y-%m-%d %I:%M %p」 %}. 
(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): 
# … app


(4) 簡單標籤的快捷方式 
Django 提供了一個幫助函數: simple_tag 。這個函數是 django.template.Library 的一個方法,它接受一個只有一個參數的函數做參數,把它包裝在 render 函數和以前說起過的其餘的必要單位中,而後經過模板系統註冊標籤。
咱們以前的的 current_time 函數因而能夠寫成這樣: 

def current_time(format_string): 
    return datetime.datetime.now().strftime(format_string) 
register.simple_tag(current_time) 
在Python 2.4中,也可使用修飾語法: 
@register.simple_tag 
def current_time(token): 
… 
有關 simple_tag 輔助函數,須要注意下面一些事情: 
傳遞給咱們的函數的只有(單個)參數。 
在咱們的函數被調用的時候,檢查必需參數個數的工做已經完成了,因此咱們不須要再作這個工做。 
參數兩邊的引號(若是有的話)已經被截掉了,因此咱們會接收到一個普通字符串。 函數


5. 包含標籤 
(1)定義標籤 
{% show_results poll %} 
(2)標籤函數 
@register.inclusion_tag('books/books_for_author.html') 
def show_books_for_author(author): 
    books = author.book_set.all() 
    return {'books': books} 
(3)標籤模板 
<ul> 
{% for book in books %} 
    <li> {{ book }} </li> 
{% endfor %} 
</ul>ui

相關文章
相關標籤/搜索