详解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快速从注释生成文档的方法
Dec 26 Python
python自动裁剪图像代码分享
Nov 25 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
便捷提取python导入包的属性方法
Oct 15 Python
Python对象与引用的介绍
Jan 24 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
在django模板中实现超链接配置
Aug 21 Python
Python3离线安装Requests模块问题
Oct 13 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Python设计密码强度校验程序
Jul 30 Python
python中subplot大小的设置步骤
Jun 28 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中设置index.php文件为只读的方法
2013/02/06 PHP
浅析php学习的路线图
2013/07/10 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
javascript 写类方式之九
2009/07/05 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
Position属性之relative用法
2015/12/14 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
vue实现图片上传功能
2020/05/28 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
Python fileinput模块使用实例
2015/06/03 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
Python插件机制实现详解
2020/05/04 Python
python3 kubernetes api的使用示例
2021/01/12 Python
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
大学生毕业求职的自我评价
2013/09/29 职场文书
测试工程师岗位职责
2013/11/28 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
内科护士节演讲稿
2014/09/11 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL