零基礎入手Django(五):自定義過濾器及標簽

今天小叮當來為大家繼續(xù)分享Django干貨彼哼。主要內容有:自定義過濾器和標簽对妄。

一、關于自定義

什么是內置敢朱?什么是自定義剪菱?

前面我們學習了內置函數、內置模版拴签、內置過濾器孝常、內置標簽,對應的也有自定義函數蚓哩、自定義模版构灸、自定義過濾器、自定義標簽岸梨。

那么喜颁,什么是內置?什么是自定義呢曹阔?所謂內置半开,這里指的是Django已經幫我們寫好的函數、模版等赃份,我們直接調用即可寂拆。所謂自定義奢米,指我們需要實現的功能,Django里面并沒有現成的函數或是模版纠永,需要我們自己手動定義實現鬓长。

二、文件路徑配置

經過前面的學習渺蒿,我們知道模版存放在“templates"目錄里痢士。同樣彪薛,自定義標簽及過濾器也有自己的存放目錄”templatetags"茂装。

(1)在項目目錄中新建python package命名為common并在主目錄settings.py中進行注冊

新建

?命名

注冊

(2)在common下新建python package命名為“templatetags"

(3)在templatetags中新建python文件命名為”common_custom"

三、自定義過濾器

方式一:裝飾器注冊

(1)在新建好的common_custom文件中編寫自定義函數

#!/usr/bin/env python# -*- coding:utf-8 -*- ?__author__ = 'IT小叮當'__time__ = '2019-01-18 20:13'from django import template

#創(chuàng)建注冊器register = template.Library()

#裝飾器的方法注冊自定義過濾器@register.filter#實現首字母變大寫其余字母均小寫的功能def my_lowercap(value): ? ?return value.capitalize()

(2)在前幾次建好的template中movie主頁index模版中測試

首先加載自定義過濾器文件

之后在使用自定義過濾器

{% load common_custom %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>movie主頁</title>
</head>
<body>
我是原始的:{{ test }}<br><br>
我使用了內置lower過濾器:{{ test|lower }}<br><br>
我使用了內置capfirst過濾器:{{ test|capfirst }}<br><br>
我串聯使用了lower過濾器和capfirst過濾器:{{test|lower|capfirst }}<br><br>
我使用了小叮當自定義的my_lowercap過濾器:{{ test|my_lowercap}}<br><br></body>
</html>

在瀏覽器中查看

可見善延,雖然內置的過濾器不能直接實現“首字母變大寫少态,其余字母變小寫。”但是易遣,我們可以通過自定義過濾器的方法一步到位彼妻。

值得注意的是,使用裝飾器注冊自定義過濾器時豆茫,還可通過在裝飾器中傳參的方式侨歉,重命名自定義的過濾器名字。

#!/usr/bin/env python# -*- coding:utf-8 -*- ?__author__ = 'IT小叮當'__time__ = '2019-01-18 20:13'from django import template

#創(chuàng)建注冊器register = template.Library()

#裝飾器的方法注冊自定義過濾器@register.filter('Mystyle')
#實現首字母變大寫其余字母均小寫的功能def my_lowercap(value): ? ?return value.capitalize()

此時在模版中使用過濾器my_lowercap便會報錯

使用重命名后的過濾器Mystyle

代碼如下

我使用了小叮當自定義的my_lowercap過濾器:{{ test|Mystyle}}<br><br>

在瀏覽器中查看

方式二:函數調用的方式注冊

在common_custom中添加如下代碼:

#自定義實現cut過濾器功能def my_cut(value,arg): ? ?return value.replace(arg,'')
#函數調用的方法注冊自定義過濾器register.filter(my_cut)

在模版中使用如下

{% load common_custom %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>movie主頁</title>
</head>
<body>
我是原始的:{{ test }}<br><br>
我使用了內置cut過濾器過濾IS:{{ test|cut:'IS'}}<br><br>
我使用了小叮當自定義的cut過濾器過濾IS:{{ test|my_cut:'IS'}}<br><br>
我使用了內置cut過濾器過濾空格:{{ test|cut:'IS'}}<br><br>
我使用了小叮當自定義的cut過濾器過濾空格:{{ test|my_cut:'IS'}}<br><br></body>
</html>

在瀏覽器中查看

小結:

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

- (輸入的)變量的值 —— 不一定是字符串形式揩魂。

- 參數的值 —— 可以有一個初始值幽邓,或者完全不要這個參數

四、自定義標簽

自定義標簽分為簡單標簽和包含標簽火脉。

簡單標簽django.template.Library.simple_tag()

包含標簽django.template.Library.inclusion_tag()

tag()方法有兩個參數:

(1) 模板標記的名稱 - 字符串牵舵。 如果省略,將使用編譯函數的名稱倦挂。

(2)編譯的函數 – 一個Python函數(不要把函數名寫成字符串)

與過濾器注冊一樣畸颅,也可以將其用作裝飾器。

1.簡單標簽

(1)在"common_custom.py"中自定義簡單標簽

代碼如下:

#自定義簡單標簽輸出當前時間import datetime

@register.simple_tagdef current_time(): ? ?format_date = '%Y年%m月%d日 %H:%M:%S' ? ?return datetime.datetime.now().strftime(format_date)

(2)在templates的movie下的index模版中進行測試

{% load common_custom %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>movie主頁</title>
</head>
<body>
我是小叮當自定義的簡單標簽:{% current_time %}<br></body>
</html>

瀏覽器中查看

簡單標簽傳參--模版中傳參

模版標簽的傳參格式:”標簽名稱+空格+參數“

自定義可傳參的簡單標簽

@register.simple_tagdef current_time2(format_date): ? ?return datetime.datetime.now().strftime(format_date)

在模版中傳參

我還是小叮當自定義的簡單標簽方援,我從模版中傳參:{% current_time2 '%Y年%m月%d日 %H:%M:%S' %}<br>

到瀏覽器中查看

簡單標簽傳參--視圖函數中通過”上下文“傳參

(1)在movie的views.py中的視圖函數里通過"context"上下文傳參

def index(request,age): ? ?return render(request,'movie/index.html',
context={'format_date':'%Y年%m月%d日 %H:%M:%S',
} )

(2)在"common_custom.py"中自定義簡單標簽

@register.simple_tag(takes_context=True)
def current_time3(context): ? ?format_date=context.get('format_date')
return datetime.datetime.now().strftime(format_date)

需要注意的是没炒,通過視圖函數上下文傳參定義的簡單標簽,需要在簡單標簽裝飾器中令”takes_context=True"(takes_context默認為False)

(3)在模板中引用

1我是小叮當自定義的簡單標簽:{%?current_time?%}<br>
2我還是小叮當自定義的簡單標簽犯戏,我從模版中傳參:{%?current_time2?'%Y年%m月%d日?%H:%M:%S'?%}<br>
3我也是小叮當自定義的簡單標簽送火,我通過視圖函數context傳參:{%?current_time3?%}<br>

(4)在瀏覽器中查看

2.包含標簽

#1問題引入

(1)movie主頁視圖函數

#定義列表li=['a','b','c']
#定義字典di={'x':1,'y':2}
tup=('x','y','z')

mytest="THIS IS TEST!"#導入時間模塊import datetime
def index(request,age): ? ?return render(request,'movie/index.html',
context={'format_date':'%Y年%m月%d日 %H:%M:%S',
'strname':'我是字符串',#傳遞字符串 ? ? ? ? ? ? ? ? ? ? ? ? ? 'hello':hello,#傳遞自定義函數 ? ? ? ? ? ? ? ? ? ? ? ? ? 'xdd_say':xdd_info.say,#傳遞類方法 ? ? ? ? ? ? ? ? ? ? ? ? ? 'xdd':xdd_info,#傳遞類對象 ? ? ? ? ? ? ? ? ? ? ? ? ? 'list':li,#傳遞列表 ? ? ? ? ? ? ? ? ? ? ? ? ? 'dict':di,#傳遞字典 ? ? ? ? ? ? ? ? ? ? ? ? ? 'test':mytest,
'xdd666':None,
'num1':18,
'num2':2,
'html':'<h1>THIS IS IN HTML!</h1>',
'float':3.1415,
'now':datetime.datetime.now,
'tuple':tup,
} )

(2)movie主頁模版

{% load common_custom %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>movie主頁</title>
</head>
<body>

{% for i in list %}
<li>{{ i }}</li>
{% endfor %}

{% for i in tuple %}
<li>{{ i }}</li>
{% endfor %}

</html>

(3)瀏覽器中查看

我們發(fā)現,要實現列表list變量和元組tuple變量的顯示笛丙,for循環(huán)模版標簽幾乎一樣漾脂,不同的只是傳入的對象從list變成了tuple

為了避免代碼重復,我們可以使用包含標簽的方法胚鸯。

(4)我們在templates下movie中新建“show_tags"html文件將骨稿,重復的代碼復制到其中。

代碼如下:

{% for i in choice %}
<li>{{ i }}</li>
{% endfor %}

#2自定義包含標簽固定傳參

(1)在"common_custom.py"中自定義包含標簽

#自定義包含標簽并與重復部分的代碼綁定@register.inclusion_tag('movie/show_tags.html')
def custom_for(): ? ?test_list=['ax','ay','az']
#將固定參數test_list傳給自定義模版標簽變量choice ? ?return {'choice':test_list}

(2)在movie模版主頁使用

{% for i in list %}
<li>{{ i }}</li>
{% endfor %}

{% for i in tuple %}
<li>{{ i }}</li>
{% endfor %}
--------------------------------------<br>
我使用了小叮當自定義的包含標簽custom_for{% custom_for %}

(3)在瀏覽器中查看

#3自定義包含標簽?通過標簽自己傳參

?(1)在"common_custom.py"中自定義包含標簽

@register.inclusion_tag('movie/show_tags.html')
def custom_for2(args): ? ?return {'choice':args}

(2)在movie模版主頁使用并傳入參數list

{% for i in list %}
<li>{{ i }}</li>
{% endfor %}

{% for i in tuple %}
<li>{{ i }}</li>
{% endfor %}
--------------------------------------<br>
我使用了小叮當自定義的包含標簽custom_for{% custom_for %}
--------------------------------------<br>
我使用了小叮當自定義的包含標簽custom_for2{% custom_for2 list %}

(3)在瀏覽器中查看

#4自定義包含標簽?接受上下文傳參

(1) 在"common_custom.py"中自定義包含標簽

@register.inclusion_tag('movie/show_tags.html',takes_context=True)
def custom_for3(context): ? ?args=context.get('list')
return {'choice':args}

傳入了對應視圖函數中的list

(2)在模版中使用自定義包含標簽

{% for i in list %}
<li>{{ i }}</li>
{% endfor %}

{% for i in tuple %}
<li>{{ i }}</li>
{% endfor %}
--------------------------------------<br>
我使用了小叮當自定義的包含標簽custom_for{% custom_for %}
--------------------------------------<br>
我使用了小叮當自定義的包含標簽custom_for2{% custom_for2 list %}
--------------------------------------<br>
我使用了小叮當自定義的包含標簽custom_for3{% custom_for3 %}

(3)在瀏覽器中查看

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坦冠,隨后出現的幾起案子形耗,更是在濱河造成了極大的恐慌,老刑警劉巖辙浑,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件激涤,死亡現場離奇詭異,居然都是意外死亡判呕,警方通過查閱死者的電腦和手機倦踢,發(fā)現死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侠草,“玉大人辱挥,你說我怎么就攤上這事”咛椋” “怎么了晤碘?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長功蜓。 經常有香客問我园爷,道長,這世上最難降的妖魔是什么式撼? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任童社,我火速辦了婚禮,結果婚禮上端衰,老公的妹妹穿的比我還像新娘叠洗。我一直安慰自己,他們只是感情好旅东,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布灭抑。 她就那樣靜靜地躺著,像睡著了一般抵代。 火紅的嫁衣襯著肌膚如雪腾节。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天荤牍,我揣著相機與錄音案腺,去河邊找鬼。 笑死康吵,一個胖子當著我的面吹牛劈榨,可吹牛的內容都是我干的。 我是一名探鬼主播晦嵌,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼同辣,長吁一口氣:“原來是場噩夢啊……” “哼拷姿!你這毒婦竟也來了?” 一聲冷哼從身側響起旱函,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤响巢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棒妨,有當地人在樹林里發(fā)現了一具尸體踪古,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年券腔,在試婚紗的時候發(fā)現自己被綠了伏穆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡颅眶,死狀恐怖蜈出,靈堂內的尸體忽然破棺而出田弥,到底是詐尸還是另有隱情涛酗,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布偷厦,位于F島的核電站商叹,受9級特大地震影響,放射性物質發(fā)生泄漏只泼。R本人自食惡果不足惜剖笙,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望请唱。 院中可真熱鬧弥咪,春花似錦、人聲如沸十绑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽本橙。三九已至扳躬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甚亭,已是汗流浹背贷币。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亏狰,地道東北人役纹。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像暇唾,于是被迫代替她去往敵國和親促脉。 傳聞我的和親對象是個殘疾皇子啰挪,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容