最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

零基礎(chǔ)入手Django(五):自定義過濾器及標(biāo)簽

2023-04-25 15:58 作者:IT小叮當(dāng)  | 我要投稿

今天小叮當(dāng)來為大家繼續(xù)分享Django干貨。主要內(nèi)容有:自定義過濾器和標(biāo)簽。

圖片

一、關(guān)于自定義

什么是內(nèi)置?什么是自定義?

前面我們學(xué)習(xí)了內(nèi)置函數(shù)、內(nèi)置模版、內(nèi)置過濾器、內(nèi)置標(biāo)簽,對(duì)應(yīng)的也有自定義函數(shù)、自定義模版、自定義過濾器、自定義標(biāo)簽。

圖片

那么,什么是內(nèi)置?什么是自定義呢?所謂內(nèi)置,這里指的是Django已經(jīng)幫我們寫好的函數(shù)、模版等,我們直接調(diào)用即可。所謂自定義,指我們需要實(shí)現(xiàn)的功能,Django里面并沒有現(xiàn)成的函數(shù)或是模版,需要我們自己手動(dòng)定義實(shí)現(xiàn)。

圖片

二、文件路徑配置

經(jīng)過前面的學(xué)習(xí),我們知道模版存放在“templates"目錄里。同樣,自定義標(biāo)簽及過濾器也有自己的存放目錄”templatetags"。

(1)在項(xiàng)目目錄中新建python package命名為common并在主目錄settings.py中進(jìn)行注冊(cè)

新建

圖片

?命名

圖片

注冊(cè)

圖片

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

圖片

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

圖片

三、自定義過濾器

方式一:裝飾器注冊(cè)

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

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

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

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

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

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

圖片

之后在使用自定義過濾器

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

在瀏覽器中查看

圖片

可見,雖然內(nèi)置的過濾器不能直接實(shí)現(xiàn)“首字母變大寫,其余字母變小寫。”但是,我們可以通過自定義過濾器的方法一步到位。

值得注意的是,使用裝飾器注冊(cè)自定義過濾器時(shí),還可通過在裝飾器中傳參的方式,重命名自定義的過濾器名字。

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

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

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

此時(shí)在模版中使用過濾器my_lowercap便會(huì)報(bào)錯(cuò)

圖片

使用重命名后的過濾器Mystyle

圖片

代碼如下

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

在瀏覽器中查看

圖片

方式二:函數(shù)調(diào)用的方式注冊(cè)

在common_custom中添加如下代碼:

#自定義實(shí)現(xiàn)cut過濾器功能
def my_cut(value,arg):
? ?return value.replace(arg,'')
#函數(shù)調(diào)用的方法注冊(cè)自定義過濾器
register.filter(my_cut)

在模版中使用如下

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

在瀏覽器中查看

圖片

小結(jié):

自定義過濾器就是一個(gè)帶有一個(gè)或兩個(gè)參數(shù)的Python 函數(shù):

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

- 參數(shù)的值 —— 可以有一個(gè)初始值,或者完全不要這個(gè)參數(shù)

圖片


四、自定義標(biāo)簽

自定義標(biāo)簽分為簡(jiǎn)單標(biāo)簽和包含標(biāo)簽。

簡(jiǎn)單標(biāo)簽django.template.Library.simple_tag()

包含標(biāo)簽django.template.Library.inclusion_tag()

tag()方法有兩個(gè)參數(shù):

(1) 模板標(biāo)記的名稱 - 字符串。 如果省略,將使用編譯函數(shù)的名稱。

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

與過濾器注冊(cè)一樣,也可以將其用作裝飾器。

1.簡(jiǎn)單標(biāo)簽

(1)在"common_custom.py"中自定義簡(jiǎn)單標(biāo)簽

圖片

代碼如下:

#自定義簡(jiǎn)單標(biāo)簽輸出當(dāng)前時(shí)間
import datetime

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

(2)在templates的movie下的index模版中進(jìn)行測(cè)試

{%
load common_custom %}
<!DOCTYPE html>
<html lang="en">
<head>
? ?<meta charset="UTF-8">
? ?<title>movie主頁(yè)</title>
</head>
<body>
我是小叮當(dāng)自定義的簡(jiǎn)單標(biāo)簽:{% current_time %}<br>
</body>
</html>

瀏覽器中查看

圖片

簡(jiǎn)單標(biāo)簽傳參--模版中傳參

模版標(biāo)簽的傳參格式:”標(biāo)簽名稱+空格+參數(shù)“

自定義可傳參的簡(jiǎn)單標(biāo)簽

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

在模版中傳參

我還是小叮當(dāng)自定義的簡(jiǎn)單標(biāo)簽,我從模版中傳參:{%
current_time2 '%Y年%m月%d日 %H:%M:%S' %}<br>

到瀏覽器中查看

圖片

簡(jiǎn)單標(biāo)簽傳參--視圖函數(shù)中通過”上下文“傳參

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

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

(2)在"common_custom.py"中自定義簡(jiǎn)單標(biāo)簽

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

需要注意的是,通過視圖函數(shù)上下文傳參定義的簡(jiǎn)單標(biāo)簽,需要在簡(jiǎn)單標(biāo)簽裝飾器中令”takes_context=True"(takes_context默認(rèn)為False)

(3)在模板中引用

1我是小叮當(dāng)自定義的簡(jiǎn)單標(biāo)簽:{%?current_time?%}<br> 2我還是小叮當(dāng)自定義的簡(jiǎn)單標(biāo)簽,我從模版中傳參:{%?current_time2?'%Y年%m月%d日?%H:%M:%S'?%}<br> 3我也是小叮當(dāng)自定義的簡(jiǎn)單標(biāo)簽,我通過視圖函數(shù)context傳參:{%?current_time3?%}<br>

(4)在瀏覽器中查看

圖片

2.包含標(biāo)簽

#1問題引入

(1)movie主頁(yè)視圖函數(shù)

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

mytest="THIS IS TEST!"
#導(dǎo)入時(shí)間模塊
import datetime
def index(request,age):
? ?return render(request,'movie/index.html',
? ? ? ? ? ? ? ? ?context={'format_date':'%Y年%m月%d日 %H:%M:%S',
? ? ? ? ? ? ? ? ? ? ? ? ? 'strname':'我是字符串',#傳遞字符串
? ? ? ? ? ? ? ? ? ? ? ? ? 'hello':hello,#傳遞自定義函數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? 'xdd_say':xdd_info.say,#傳遞類方法
? ? ? ? ? ? ? ? ? ? ? ? ? 'xdd':xdd_info,#傳遞類對(duì)象
? ? ? ? ? ? ? ? ? ? ? ? ? '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主頁(yè)模版

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

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

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

</html>

(3)瀏覽器中查看

圖片

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

圖片

為了避免代碼重復(fù),我們可以使用包含標(biāo)簽的方法。

(4)我們?cè)趖emplates下movie中新建“show_tags"html文件將,重復(fù)的代碼復(fù)制到其中。

圖片

代碼如下:

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

#2自定義包含標(biāo)簽固定傳參

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

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

(2)在movie模版主頁(yè)使用

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

{% for i in tuple %}
? ?<li>{{ i }}</li>
{% endfor %}
--------------------------------------<br>
我使用了小叮當(dāng)自定義的包含標(biāo)簽custom_for
{% custom_for %}

(3)在瀏覽器中查看

圖片

#3自定義包含標(biāo)簽?通過標(biāo)簽自己傳參

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

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

(2)在movie模版主頁(yè)使用并傳入?yún)?shù)list

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

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

(3)在瀏覽器中查看

圖片

#4自定義包含標(biāo)簽?接受上下文傳參

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

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

傳入了對(duì)應(yīng)視圖函數(shù)中的list

圖片

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

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

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

(3)在瀏覽器中查看

圖片




零基礎(chǔ)入手Django(五):自定義過濾器及標(biāo)簽的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
丰宁| 呈贡县| 广东省| 二手房| 怀化市| 甘孜县| 平顶山市| 得荣县| 成武县| 拜泉县| 台东县| 磴口县| 东阿县| 星子县| 绥芬河市| 霍邱县| 扶余县| 阜阳市| 岳西县| 天津市| 临海市| 涟水县| 嘉义县| 岳阳县| 鸡西市| 红桥区| 汾西县| 富民县| 昆明市| 丰宁| 扎鲁特旗| 农安县| 南汇区| 德安县| 易门县| 麻栗坡县| 靖边县| 尼勒克县| 伊通| 盐边县| 韶山市|