1. 程式人生 > >Django自定義過濾器和標籤

Django自定義過濾器和標籤

Django的模板語言包含了各種各樣的內建標籤和過濾器來滿足你的應用需求,不過有時候你也會發現你的需要的功能不在內建的功能中,這時候你可以通過Python語言自定義標籤和過濾器來擴充套件模板引擎,然後在你的模板中使用 {% load %} 來載入使用它們。
首先建立好包檔案:
在你的app下建立templatetags包,在其下建立python指令碼來定義你的標籤和過濾器page.py檔案,特別注意裡面的__init__.py檔案,它告訴Python這裡是一個包,格式如:

myapp/
    __init__.py
    templatetags/
        __init__.py
        page.py
    views.py
    models.py

接著編寫page.py檔案的內容

# -*- coding: utf-8 -*-
#這裡先匯入模板庫
from django import template
register=template.Library()


#自定義自己的過濾器,將傳入發字串轉為大寫
@register.filter
def my_upper(val):
    print('val from template:',val)
    return val.upper()

#自定義標籤
from django.utils.html import format_html
@register.simple_tag
def circle_page(curr_page,loop_page):
    offset=abs(curr_page-loop_page)
    if offset<3:
        if curr_page==loop_page:
            page_ele='<li class="liactive"><a class="selected" href="/backstage/test/?page=%s">%s</a></li>'%(loop_page,loop_page)
        else:
            page_ele='<li class="itemli"><a href="/backstage/test/?page=%s">%s</a></li>'%(loop_page,loop_page)

        return format_html(page_ele)
    else:
        return ''

在需要進行引入的.html檔案的最上方中,增加如下,將檔案引入:

{% load page %}

在具體需要過濾的地方,引入我們page.py檔案中定義的函式:

 <span class="sourse"  >{{ video.source }} | my_upper</span>   {#這裡將video.source的值傳入my_upper()函式進行處理#}

在需要自定義標籤的地方,引入:

   {# 頁碼開始#}
   {% for num in paginator.page_range %}
       {% circle_page currentPage num %}	{# 這裡就是我們自定義的標籤,circle_page是期末前面自定義的函式,currentPage和num是我們傳入的引數,當前頁碼和迴圈頁碼#}
   {% endfor %}
   {#頁碼結束#}