详解django中自定义标签和过滤器


Posted in Python onJuly 03, 2017

想要实现自定义标签和过滤器需要进行准备工作:

准备(必需)工作:

1  在某个app下创建一个名为templatetags(必需,且包名不可变)的包。假设我们在名为polls的app下创建了一个templatetags的包,并在该包下创建了一个名为mytags的文件。那么目录结构看起来应该就像这样:

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

2  settings文件中的INSTALLD_APPS内必须含有该app。接下来,我们需要确认settings文件中的INSTALLED_APPS变量中已经有了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 template

register = template.Library()

4  在模板中使用{% load %} 标签装载自定义标签或者装饰器

{% load mytags %}

自定义过滤器:

1  自定义过滤器实际上就是写一个函数

2  django会将过滤器前的值传入该函数

3  函数完成后,需要进行登记register

因为第二步django已经帮我们完成,所以我们实际上只需要自己完成第一步和第三步

实例:写一个自动省略多余字符串的过滤器 

1  定义一个  truncate_chars  函数

# 若字符串长度大于30,则省略之后的内容,否则原样输出该字符串。参数value就是过滤器前的值
def truncate_chars(value):
  if value.__len__() > 30:
    return '%s......'% value[0:30]
  else:
    return value

2  register该函数

# 登记
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)函数默认需要两个参数,name是装饰器的名称(字符串类型),function是函数名。后面三个参数可以参考 官方文档。 我们也可以通过装饰器进行登记

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

如果没有使用name参数,django默认会将函数名作为name参数的值,所以下面的代码和上面的代码作用相同。

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

3  测试模板文件内容

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

4  浏览器显示结果

详解django中自定义标签和过滤器

自定义标签

自定义标签相对于自定义过滤器来说要复杂很多,因为自定义标签可以做任何事情!

自定义标签分为很多类型

1  简单标签  Simple tags

2  内含标签  Inclusion tags

3  分配标签  Assignment tags

一  简单标签

import datetime
from django import template

register = template.Library()

@register.simple_tag
def current_time(format_string):
  return datetime.datetime.now().strftime(format_string)

Library.simple_tag(takes_context=True)  takes_context=True参数可以让我们访问模板的当前环境上下文,即将当前环境上下文中的参数和值作为字典传入函数中的一个名为context的参数

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

当使用take_context=True时,函数的第一个参数必需为context。也可以使用name参数对函数进行重命名。

二  内含标签

这种类型的标签可以被其他模板进行渲染,然后将渲染结果输出

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

from django import template
register = template.Library()

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

result.html 内容

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

test.html内容

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

view函数:

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

当访问http://127.0.0.1:8000/test/时,浏览器显示:

详解django中自定义标签和过滤器 

三  分配标签

类似于简单标签,但并不会输出结果,可以使用 as 关键字将结果赋给一个参数。

@register.assignment_tag
def 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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python os模块介绍
Nov 30 Python
python实现简单购物商城
May 21 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
Django如何开发简单的查询接口详解
May 17 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
Jul 13 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
pygame实现弹力球及其变速效果
Jul 03 #Python
[原创]使用豆瓣提供的国内pypi源
Jul 02 #Python
python中安装Scrapy模块依赖包汇总
Jul 02 #Python
Python使用filetype精确判断文件类型
Jul 02 #Python
使用python实现tcp自动重连
Jul 02 #Python
详解python3中socket套接字的编码问题解决
Jul 01 #Python
详解Python中for循环是如何工作的
Jun 30 #Python
You might like
PHP 采集获取指定网址的内容
2010/01/05 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
PHP运行模式汇总
2016/11/06 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
javascript globalStorage类代码
2009/06/04 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
Python实现发送email的几种常用方法
2014/08/18 Python
详解Python发送邮件实例
2016/01/10 Python
关于python写入文件自动换行的问题
2018/06/23 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
什么是会话Bean
2015/05/14 面试题
大学新生军训自我鉴定
2014/03/18 职场文书
家长会学生演讲稿
2014/04/26 职场文书
求职自我推荐信
2014/06/25 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
政协委员个人总结
2015/03/03 职场文书
雷锋电影观后感
2015/06/10 职场文书
张丽莉事迹观后感
2015/06/16 职场文书