1. 程式人生 > >Django學習筆記之自定義過濾器及標籤

Django學習筆記之自定義過濾器及標籤

目錄結構:

在專案目錄下 建立個名為common的Python包
這裡寫圖片描述
將common加入到settings檔案中的INSTALLED_APP列表中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions', #
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book.apps.BookConfig'
, 'common', #相當於是一個進行註冊了的app ]

在common裡面建立目錄templatetages,在目錄裡面建立自定義過濾器及標籤檔案.
這裡寫圖片描述
**注意:**templatetags這個目錄名字是固定的,而裡面的模組名是自定義的
在common_extras.py檔案中自定義cut和lower的過濾器功能
一.自定義過濾器

# cut 過濾器的功能
def mycut(value,arg):
    return value.replace(arg,'')
# 對mycut進行註冊
register.filter('mycut',mycut)

註冊自定義過濾器:

django.template.Library.filter()
1.Library.filter()方法需要兩個引數:
    a. 過濾器的名稱(一個字串物件)
    b. 編譯的函式 – 一個Python函式(不要把函式名寫成字串)
2.可以把register.filter()用作裝飾器;
3.沒有宣告 name 引數,Django將使用函式名作為過濾器的名字。

例子:

from django import template
register = template.Library() #例項化
# 對mycut進行註冊
register.filter('mycut',mycut)

# 裝飾器 進行註冊
@register.filter def mylower(value): return value.lower()

使用自定義過濾器:

#需要使用{% load %}標籤將我們的自定義模組載入進來
{% load %} 宣告將會載入給定模組名中的標籤/過濾器
{% load common_extras %} #要寫在模板檔案第一行

二.自定義標籤
1.簡單標籤django.template.Library.simple_tag()
2.包含標籤django.template.Library.inclusion_tag()
tag()方法有兩個引數:
1. 模板標記的名稱 - 字串。 如果省略,將使用編譯函式的名稱。
2. 編譯的函式 – 一個Python函式(不要把函式名寫成字串)
與過濾器註冊一樣,也可以將其用作裝飾器。

自定義簡單標籤的例子:
1.定義一個顯示當前時間的簡單標籤

@register.simple_tag
def current_time():
    return datetime.datetime.now().strftime('%Y年%m月%d日  %H:%M:%S')

2.簡單標籤,傳引數,,需傳入時間格式

# 簡單標籤 傳引數
@register.simple_tag
def current_time2(format_string):
    return datetime.datetime.now().strftime(format_string)

3.註冊標籤時使用takes_context 引數,則可以使用從上下文中傳入的引數.

# 從上下文中傳進來引數
@register.simple_tag(takes_context=True)
def current_time3(context):
    format_string = context.get('format_string')
    return datetime.datetime.now().strftime(format_string)

3.模板中使用自定義的標籤
這裡寫圖片描述

自定義包含標籤的例子:
1.包含標籤的功能是可以通過渲染另外一個模板來顯示一些資料

#例如很多地方都可能會用到下面這幾行程式碼,除了choices這個變數不一樣之外,其他的都是格式都一樣時,那麼我們就可以把這部分程式碼封裝在一個包含標籤中.
# music/show_tags.html
<ul>
    {% for i in choices %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>
@register.inclusion_tag('music/show_tags.html')
def show_result():
    ls = ['xxx','yyy','zzz']
    return {'choice':ls}

2.包含標籤 模板裡面傳參

@register.inclusion_tag('music/show_tags.html')
def show_result2(choice):
    # ls = ['xxx','yyy','zzz']
    return {'choice':choice}
模板裡面傳參: {% show_result2 ls %}

3.包含標籤 上下文傳參

@register.inclusion_tag('music/show_tags.html',takes_context=True)
def show_result3(context):
    ls = context.get('ls')
    return {'choice':ls}

檢視函式(通過上下文傳參的引數在這裡):

def index5(request):
    return render(request, 'music/index5.html',
                  context={'test':'Abc Def Ghi',
                           'format_string':'%Y/%m/%d   %H:%M:%S',
                           'ls':ls,
                           }
                  )