详解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正则表达式介绍
Aug 06 Python
Python datetime时间格式化去掉前导0
Jul 31 Python
深入学习Python中的装饰器使用
Jun 20 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
Python3实现的字典遍历操作详解
Apr 18 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Django 实现对已存在的model进行更改
Mar 28 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
python实现简单的名片管理系统
Apr 26 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查看session内容的函数
2008/08/27 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php网页病毒清除类
2014/12/08 PHP
CI框架常用函数封装实例
2016/11/21 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
python有证书的加密解密实现方法
2014/11/19 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
选秀节目策划方案
2014/06/06 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
会议主持词通用版
2019/04/02 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python