国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解django中自定義標(biāo)簽和過濾器

2020-01-04 16:55:59
字體:
供稿:網(wǎng)友

想要實(shí)現(xiàn)自定義標(biāo)簽和過濾器需要進(jìn)行準(zhǔn)備工作:

準(zhǔn)備(必需)工作:

1  在某個(gè)app下創(chuàng)建一個(gè)名為templatetags(必需,且包名不可變)的包。假設(shè)我們在名為polls的app下創(chuàng)建了一個(gè)templatetags的包,并在該包下創(chuàng)建了一個(gè)名為mytags的文件。那么目錄結(jié)構(gòu)看起來應(yīng)該就像這樣:

polls/  __init__.py  models.py  templatetags/    __init__.py    mytags.py  views.py

2  settings文件中的INSTALLD_APPS內(nèi)必須含有該app。接下來,我們需要確認(rèn)settings文件中的INSTALLED_APPS變量中已經(jīng)有了polls

INSTALLED_APPS = (  'django.contrib.admin',  'django.contrib.auth',  'django.contrib.contenttypes',  'django.contrib.sessions',  'django.contrib.messages',  'django.contrib.staticfiles',  'polls',)

3  接下來在mytags文件中寫入如下幾行

from django import templateregister = template.Library()

4  在模板中使用{% load %} 標(biāo)簽裝載自定義標(biāo)簽或者裝飾器

{% load mytags %}

自定義過濾器:

1  自定義過濾器實(shí)際上就是寫一個(gè)函數(shù)

2  django會(huì)將過濾器前的值傳入該函數(shù)

3  函數(shù)完成后,需要進(jìn)行登記register

因?yàn)榈诙絛jango已經(jīng)幫我們完成,所以我們實(shí)際上只需要自己完成第一步和第三步

實(shí)例:寫一個(gè)自動(dòng)省略多余字符串的過濾器 

1  定義一個(gè)  truncate_chars  函數(shù)

# 若字符串長度大于30,則省略之后的內(nèi)容,否則原樣輸出該字符串。參數(shù)value就是過濾器前的值def truncate_chars(value):  if value.__len__() > 30:    return '%s......'% value[0:30]  else:    return value

2  register該函數(shù)

# 登記register.filter('truncate_chars',truncate_chars)def truncate_chars(value):  if value.__len__() > 30:    return '%s......'% value[0:30]  else:    return value

Library.filter(name,function,is_safe=False,needs_autoescape=False,excepts_localtime=False)函數(shù)默認(rèn)需要兩個(gè)參數(shù),name是裝飾器的名稱(字符串類型),function是函數(shù)名。后面三個(gè)參數(shù)可以參考 官方文檔。 我們也可以通過裝飾器進(jìn)行登記

@register.filter(name='truncate_filter')def truncate_chars(value):  if value.__len__() > 30:    return '%s......'% value[0:30]  else:    return value

如果沒有使用name參數(shù),django默認(rèn)會(huì)將函數(shù)名作為name參數(shù)的值,所以下面的代碼和上面的代碼作用相同。

@register.filterdef truncate_chars(value):  if value.__len__() > 30:    return '%s......'% value[0:30]  else:    return value

3  測試模板文件內(nèi)容

{% load mytags %}<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Title</title></head><body>{{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdffalskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }}</body></html>

4  瀏覽器顯示結(jié)果

django,自定義標(biāo)簽,自定義過濾器,過濾器

自定義標(biāo)簽

自定義標(biāo)簽相對(duì)于自定義過濾器來說要復(fù)雜很多,因?yàn)樽远x標(biāo)簽可以做任何事情!

自定義標(biāo)簽分為很多類型

1  簡單標(biāo)簽  Simple tags

2  內(nèi)含標(biāo)簽  Inclusion tags

3  分配標(biāo)簽  Assignment tags

一  簡單標(biāo)簽

import datetimefrom django import templateregister = template.Library()@register.simple_tagdef current_time(format_string):  return datetime.datetime.now().strftime(format_string)

Library.simple_tag(takes_context=True)  takes_context=True參數(shù)可以讓我們訪問模板的當(dāng)前環(huán)境上下文,即將當(dāng)前環(huán)境上下文中的參數(shù)和值作為字典傳入函數(shù)中的一個(gè)名為context的參數(shù)

@register.simple_tag(takes_context=True)def current_time(context, format_string):  timezone = context['timezone']  return your_get_current_time_method(timezone, format_string)

當(dāng)使用take_context=True時(shí),函數(shù)的第一個(gè)參數(shù)必需為context。也可以使用name參數(shù)對(duì)函數(shù)進(jìn)行重命名。

二  內(nèi)含標(biāo)簽

這種類型的標(biāo)簽可以被其他模板進(jìn)行渲染,然后將渲染結(jié)果輸出

Library.inclusion_tag()支持take_context=True,用法類似Library.simple_tag()

from django import templateregister = template.Library()@register.inclusion_tag('result.html')def test():  a=['first','second','third']  return {'choices':a}

result.html 內(nèi)容

<ul>{% for choice in choices %}  <li> {{ choice }} </li>{% endfor %}</ul>

test.html內(nèi)容

{% load mytags %}<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Title</title></head><body>{% test %}</body></html>

view函數(shù):

def test(request):  return render(request,'test.html')

當(dāng)訪問http://127.0.0.1:8000/test/時(shí),瀏覽器顯示:

django,自定義標(biāo)簽,自定義過濾器,過濾器

三  分配標(biāo)簽

類似于簡單標(biāo)簽,但并不會(huì)輸出結(jié)果,可以使用 as 關(guān)鍵字將結(jié)果賦給一個(gè)參數(shù)。

@register.assignment_tagdef get_current_time(format_string):  return datetime.datetime.now().strftime(format_string)
{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}<p>The time is {{ the_time }}.</p>

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿克苏市| 金塔县| 堆龙德庆县| 弥渡县| 陈巴尔虎旗| 曲水县| 峨眉山市| 如皋市| 临漳县| 汉中市| 庆安县| 全南县| 海口市| 井陉县| 江津市| 甘孜县| 祁连县| 大姚县| 江川县| 德州市| 磐安县| 赞皇县| 宜黄县| 黔南| 洪雅县| 建德市| 洱源县| 乌兰县| 长葛市| 图木舒克市| 石泉县| 化隆| 临猗县| 文成县| 健康| 肥西县| 东光县| 龙陵县| 通河县| 库尔勒市| 东阳市|