Django 框架13: 自定義過濾器和標籤

    Django的模板系統自帶了一系列的內建標籤和過濾器,通常狀況下能夠知足開發要求,若是以爲需更精準的模板標籤或者過濾器,能夠本身編寫模板標籤和過濾器,而後使用{% load %}標籤使用他們。最好是查看Django的文檔:自定義模板標籤和過濾器,這裏僅僅簡單的敘述一下,大部分仍是參考官方文檔。python

自定義過濾器django

1.代碼佈局  
       自定義標籤和過濾器必須依賴於一個django app,也就是說,自定義標籤和過濾器是綁定app的。該app應該包含一個templatetags目錄,這個目錄應該和model.py,views.py在同一個層級,記得在該目錄下創建一個__init__.py文件一遍django知道這是一個python包。在該目錄下,你能夠新建一個python模塊文件,文件名不要和其餘app中的衝突就好。例如:app

polls/
    models.py
    templatetags/
        __init__.py
        poll_extras.py
    views.py

    而後在你的模板文件中你能夠這樣使用你的自定義標籤和過濾器:函數

{% load poll_extras %}

    注意事項:
           包含templatetags目錄的app必定要在INSTALLED_APPS列表裏面
           {% load %}load的是模塊名,而不是app名
           記得要引入template模塊,建立一個register對象佈局

from django import template

register=template.Library() # 註冊

2.編寫自定義過濾器
    自定義過濾器就是接受一個或者連個參數的python函數。例如{{var | foo:"bar"}},過濾器foo接受變量var和參數bar。
    過濾器函數總要返回一些內容,而且不該該拋出異常,若是有異常,也應該安靜的出錯,因此出錯的時候要不返回原始的輸入或者空串,下面是一個例子:code

def cut(value, arg):
    """Removes all values of arg from the given string"""
    return value.replace(arg, '')
# 使用
{{ somevariable|cut:"0" }}

    若是過濾器不接受參數,只須要這樣寫orm

def lower(value): # 只有一個參數
    return value.lower()

3.註冊自定義的過濾器  
    一旦定義好你的過濾器,你須要註冊這個過濾器,有兩種方式,一種是上面提到的template.Library(),另外一種是裝飾器對象

#第一種方法
register.filter('cut', cut)
register.filter('lower', lower)

#第二種方法
@register.filter(name='cut')
def cut(value, arg):
    return value.replace(arg, '')
@register.filter
def lower(value):
    return value.lower()

    詳細內容請查閱Django的文檔:自定義模板標籤和過濾器開發

編寫自定義模板標籤文檔

    標籤比過濾器更復雜,由於標籤能夠作任何事情。Django提供了許多快捷方式,能夠更輕鬆地編寫大多數類型的標籤。首先,咱們將探索這些快捷方式,而後解釋如何在快捷方式不夠強大的狀況下從頭開始編寫標記
    爲了簡化這些類型標籤的建立,Django提供了一個輔助函數 simple_tag。這個函數是一個方法 django.template.Library,它接受一個接受任意數量參數的函數,將它包裝在一個render函數中,並將上面提到的其餘必要位包裝在模板系統中
    current_time所以,咱們的函數能夠這樣寫:

import datetime
from django import template

register = template.Library()

@register.simple_tag
def current_time(format_string):
    return datetime.datetime.now().strftime(format_string)

    更多內容還請查閱Django的文檔:自定義模板標籤和過濾器,不過這些已經基本足夠使用了。

相關文章
相關標籤/搜索