详解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批量修改文件名的实现代码
Sep 01 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
关于反爬虫的一些简单总结
Dec 13 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
python中使用while循环的实例
Aug 05 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
pytorch 实现L2和L1正则化regularization的操作
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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
法定代表人身份证明书
2014/09/10 职场文书
2015年暑假生活总结
2015/07/13 职场文书
初三语文教学反思
2016/03/03 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电