详解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下ftp上传文件linux服务器
Jun 21 Python
python使用scrapy发送post请求的坑
Sep 04 Python
Python自动发送邮件的方法实例总结
Dec 08 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
Python的Tkinter点击按钮触发事件的例子
Jul 19 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Python urllib.request对象案例解析
May 11 Python
Python -m参数原理及使用方法解析
Aug 21 Python
弄清Pytorch显存的分配机制
Dec 10 Python
Django后端按照日期查询的方法教程
Feb 28 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 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
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
2020/02/06 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
Python 创建子进程模块subprocess详解
2015/04/08 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
python如何实现图片压缩
2020/09/11 Python
利用python进行文件操作
2020/12/04 Python
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
市政施工员自我鉴定
2014/01/15 职场文书
酒店节能减排方案
2014/05/26 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
二年级数学教学反思
2016/02/16 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
Django中celery的使用项目实例
2022/07/07 Python