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

自定義過濾器和自定義標籤

自定義標籤和過濾器 需要執行的3個步驟:

1. 在app中建立templatetags模組(必須的)

2. 建立任意 .py 檔案,如:my_tags.py

3. 建立任意  .py檔案, 例如:my_tags.py

自定義過濾器

舉例: 增加一個乘法過濾器

修改settings.py中的INSTALLED_APPS, 最後一行添加當前的app

django開頭的,都是一些自帶的app。它內建在django原始碼裡面

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth
', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', ]

在app01目錄裡面新建一個templatetags目錄,目錄名必須是這個!!!否則django找不到

目錄裡面建立my_filter_tag.py, 這個py檔名,可以隨便起

from django import template
from django.utils.safestring import
mark_safe
#因為django遇到html或者js標籤,會轉義。它認為是不安全的,所以需要在過濾器中匯入make_safe模組 register
= template.Library() #register的名字是固定的,不可改變 @register.filter #自定義過濾器 def multi_filter(v1,v2): return v1 * v2

注意:頭部的3行,是固定寫法,不能改變。

增加  @register.filter  是為了將函式轉換成過濾器.  函式的名字可以隨便起

修改 views.py 裡面的index函式, 內容如下

def index(request):
    num = 100
    return render(request,'index.html',{'num':num})

修改index.html  的body部分

注意:在使用自定義標籤和過濾器,必須在html檔案中,匯入之前建立的my_filter_tag

 

{% load my_filter_tag %}
<p>{{ num|multi_filter:5 }}</p>

 

load表示匯入模組. 

p標籤中的內容是執行了multi_filter過濾器

注意:接收了2個引數, 一個是num, 一個是5.  因為 multi_filter 傳入了2個形參,必須傳入2個引數才可以.

django專案啟動時,會匯入settings.py定義的模組匯入,由於app01的自定義模組是啟動之後加的,所以要重新啟動django專案. 得到的結果是500

 

自定義過濾器就是一個帶有一個或兩個引數的Python函式

 

注意:這個Python函式的第一個引數是你要過濾的物件,第二個引數才是你自定義的引數。而且最多總共只能有兩個引數,所以你只能自定義一個引數!這是過濾器的先天限制。

 

  • 變數的值:不一定是字串形式。
  • 引數的值:可以有一個初始值,或者完全不要這個引數。

 

例如,在{{ var|foo:"bar" }}中,foo過濾器應當傳入變數var和引數"bar"。

 

 

過濾器中的語法: {{ value|filter_name:引數 }} # 引數最多隻有一個

如果要完成3位數的乘法,過濾器可以增加一個形參,但是index.html中怎麼辦呢?

只能在後端,將引數形式修改成列表,元組,字典等形式.

例如計算 4*5*6

修改index檢視函式

 

def index(request):
    num1 = 4
    num2 = 5
    num3 = 6
    num_list = [num1,num2,num3]
    return render(request,'index.html',{'num_list':num_list})

 

修改my_filter_tag.py中的過濾器

@register.filter
def multi_filter(num_list):
    res = 1
    for i in num_list:
        res*=i
    return res

修改index.html,修改body部分

{% load my_filter_tag %}
<p>{{ num_list|multi_filter }}</p>

舉例: 顯示a標籤

修改my_filter_tag.py檔案,增加link_tag過濾器

@register.filter
def link_tag(href):
    return mark_safe("<a href=%s>click</a>" % href   
#使用make_safe方法,告訴django是安全的,不需要轉義

修改index檢視

def index(request):
    link = "http://www.py3study.com/"
    return render(request,'index.html',{'link':link})

修改index.html

{% load my_filter_tag %}
<p>{{ link|link_tag }}</p>

自定義標籤

標籤, 是為了做一些功能

舉例: 4個引數的乘法運算

修改my_filter_tag.py,  增加multi_tag函式

@register.simple_tag
def multi_tag(x,y,z):
    return x*y*z

@register.simple_tag表示將函式轉換為自定義標籤

 

 

 

修改index.html,修改body部分

 

注意:呼叫標籤,使用{% 標籤過濾器名 引數1,引數2,引數3... %}

 

引數不限,但不能放在if for語句中

 

 

{% load my_filter_tag %}
<p>{% multi_tag 4 5 6 %}</p>

 

重新啟動django專案, 檢視結果

 

自定義標籤和自定義過濾器的區別:

1. 標籤,是為了做一些功能。過濾器,是對斜槓前面的資料做過濾。

2. 標籤可以寫任意個形參,而過濾器最大隻能寫2個形參。如果過濾器需要接收多個引數,需要將引數存放在列表,元組,字典等資料中。

3. 過濾器可以用在if等語句後,標籤不可以