详解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输出一个杨辉三角的例子
Jun 13 Python
Python中装饰器的一个妙用
Feb 08 Python
玩转python爬虫之正则表达式
Feb 17 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
django 在原有表格添加或删除字段的实例
May 27 Python
python递归实现快速排序
Aug 18 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
如何用python免费看美剧
Aug 11 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 Python
Python的三个重要函数详解
Jan 18 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 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与MySQL交互使用详解
2006/10/09 PHP
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
Javascript模块模式分析
2008/05/16 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
解决PyCharm中光标变粗的问题
2017/08/05 Python
python-opencv颜色提取分割方法
2018/12/08 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
英国森林假期:Forest Holidays
2021/01/01 全球购物
应用电子专业学生的自我评价
2013/10/16 职场文书
铁路工务反思材料
2014/02/07 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
杨善洲电影观后感
2015/06/04 职场文书
学子宴致辞大全
2015/07/27 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript