详解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 相关文章推荐
在Django中创建动态视图的教程
Jul 15 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
Python+Django搭建自己的blog网站
Mar 13 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
python实现连连看辅助(图像识别)
Mar 25 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 Python
python import 上级目录的导入
Nov 03 Python
用Python制作音乐海报
Jan 26 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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
Function eregi is deprecated (解决方法)
2013/06/21 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
Python常用的爬虫技巧总结
2016/03/28 Python
python对json的相关操作实例详解
2017/01/04 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
Python numpy数组转置与轴变换
2019/11/15 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
日语专业推荐信
2013/11/12 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
基层党员对照检查材料
2014/09/24 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
大学生个人总结范文
2015/02/15 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL