详解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中cPickle用法例子分享
Jan 03 Python
python局域网ip扫描示例分享
Apr 03 Python
理解python正则表达式
Jan 15 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
解决Django中多条件查询的问题
Jul 18 Python
python 调试冷知识(小结)
Nov 11 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
Python代码注释规范代码实例解析
Aug 14 Python
python实现无边框进度条的实例代码
Dec 30 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
重置版战役片段
2020/04/09 魔兽争霸
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
js实现转动骰子模型
2019/10/24 Javascript
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
C面试题
2015/10/08 面试题
为什么要做架构设计
2015/07/08 面试题
结婚典礼证婚词
2014/01/08 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
如何撰写创业策划书
2019/06/27 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
python实现会员管理系统
2022/03/18 Python
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
如何使用SQL Server语句创建表
2022/04/12 SQL Server
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js