1.创建一个模板库

使用模板过滤器的时候,直接把过滤器写在app里,
例如:在app里新建一个templatetags的文件夹,这个目录应当和 models.py 、 views.py 等处于同一层次。例如: 
books/ 
    __init__.py 
    models.py 
    templatetags/ 
    views.py 
在 templatetags 中创建两个空文件:一个 __init__.py (告诉Python这是一个包含了Python代码的包)和一个用来存放你自定义的标签/过滤器定义的文件。第二个文件的名字稍后将用来加载标签。例如,如果你的自定义标签/过滤器在一个叫作 poll_extras.py 的文件中,你需要在模板中写入如下内容: {% load poll_extras %}
{% load %} 标签检查 INSTALLED_APPS 中的设置,仅允许加载已安装的Django应用程序中的模板库。 
要成为有效的标签库,模块必须包含一个模块级的变量: register ,这是一个 template.Library 的实例。这个 template.Library 实例是包含所有已注册的标签及过滤器的数据结构。因此,在模块的顶部位置插入下述代码:
from django import template 
register = template.Library()

2. 自定义模板过滤器 
自定义过滤器就是有一个或两个参数的Python函数::
例如,在过滤器 {{ var|foo:”bar” }} 中 ,过滤器 foo 会被传入变量 var 和参数 bar 的内容。 
过滤器函数应该总有返回值,而且不能触发异常,它们都应该静静的失败。如果有一个错误发生,它们要么返回原始的输入字符串,要么返回空的字符串,无论哪个都可以。 
1)这里是一些定义过滤器的例子: 
def cut(value, arg): 
    "Removes all values of arg from the given string" 
return value.replace(arg, '') 
def lower(value): # Only one argument. 
    "Converts a string into all lowercase" 
    return value.lower() 
2)这里是一些如何使用过滤器的例子: 
    {{ somevariable|cut:”0″ }} 
3)下面是一个完整的模板库的例子,提供了一个 cut 过滤器: 
from django import template 
register = template.Library() 
@register.filter(name='cut') (装饰器)
def cut(value, arg): 
    return value.replace(arg, '')

@register.filter 
def lower(value): 
    return value.lower() 
   注意:1)在定义过滤器时,需要用 Library 实例来注册它,这样就能通过Django的模板语言来使用了: Python 2.4或更新,可以通过上面的装饰器   实现,如果不使用 name 参数,@register.filter那么Django将会使用函数名作为过滤器的名字
2)保证templatetags在已经INSTALLED_APPS里面,

3. 自定义模板标签 
(1)定义标签 
The time is {% current_time “%Y-%m-%d %I:%M %p” %}. 
(2)编写模板标签分析器mytag.py 
from django import template 
def do_current_time(parser, token): 
    try: 
        # split_contents() knows not to split quoted strings. 
        tag_name, format_string = token.split_contents() 
    except ValueError: 
        msg = '%r tag requires a single argument' % token.contents()[0] 
        raise template.TemplateSyntaxError(msg) 
    return CurrentTimeNode(format_string[1:-1]) 
(3) 编写模板节点 
import datetime 
class CurrentTimeNode(template.Node): 
    def __init__(self, format_string): 
        self.format_string = format_string 
    def render(self, context): 
        now = datetime.datetime.now() 
        return now.strftime(str(self.format_string)) 
(4) 注册标签 
register = template.Library() 
register.tag(’current_time’, do_current_time) 
或 
@register.tag(name=”current_time”) 
def do_current_time(parser, token): 
# …

(4) 简单标签的快捷方式 
Django 提供了一个帮助函数: simple_tag 。这个函数是 django.template.Library 的一个方法,它接受一个只有一个参数的函数作参数,把它包装在 render 函数和之前提及过的其他的必要单位中,然后通过模板系统注册标签。
我们之前的的 current_time 函数于是可以写成这样:

def current_time(format_string): 
    return datetime.datetime.now().strftime(format_string) 
register.simple_tag(current_time) 
在Python 2.4中,也可以使用修饰语法: 
@register.simple_tag 
def current_time(token): 
… 
有关 simple_tag 辅助函数,需要注意下面一些事情: 
传递给我们的函数的只有(单个)参数。 
在我们的函数被调用的时候,检查必需参数个数的工作已经完成了,所以我们不需要再做这个工作。 
参数两边的引号(如果有的话)已经被截掉了,所以我们会接收到一个普通字符串。

5. 包含标签 
(1)定义标签 
{% show_results poll %} 
(2)标签函数 
@register.inclusion_tag('books/books_for_author.html') 
def show_books_for_author(author): 
    books = author.book_set.all() 
    return {'books': books} 
(3)标签模板 
<ul> 
{% for book in books %} 
    <li> {{ book }} </li> 
{% endfor %} 
</ul>

Django 自定义模板标签和过滤器的更多相关文章

  1. Django自定义模板标签和过滤器

    1.创建模板库 在某个APP所在目录下新建包templatetags,然后在其中创建存储标签或者过滤器的的模块,名称随意,例如myfilters.py. 在这个模块中编写相关代码. 注意:templa ...

  2. django “如何”系列4:如何编写自定义模板标签和过滤器

    django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码 ...

  3. 模板继承and自定义模板标签和过滤器

    自定义模板标签和 过滤器: 因为模板标签和过滤器只给我们提供了 这么多 无法对我们的使用造成更多的便利 ,剩下的就需要我们自己去创建新的 模板标签和过滤器了 1.在settings中的INSTALLE ...

  4. Django 自定义模版标签和过滤器

    实现自定义过滤器 1. 创建register变量 在你的模块文件中,你必须首先创建一个全局register变量,它是用来注册你自定义标签和过滤器的, 你需要在你的python文件的开始处,插入几下代码 ...

  5. django特殊的标签和过滤器

    国际化标签和过滤器 Django还提供了一些模板标签和过滤器,用以控制模板中国际化的每个方面.它们允许对翻译,格式化和时区转换进行粒度控制. 1. i18n 此标签允许在模板中指定可翻译文本.要启用它 ...

  6. python3之Django内置模板标签和过滤器

    一.模板标签 内置标签: 1.autoescape 控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效.该块以endautoescape结束标签关闭. views: ...

  7. django 内建标签和过滤器参考

    下面的标签和过滤器参考就是为那些没有 admin 站点的可用的人准备的.由于 Django 是高度可定制的,你的 admin 里的关于标签和过滤器的参考可以认为是最可信的. 内建标签参考 block ...

  8. django自定义模板标签

    # 创建自定义模板标签目录 django_project_name app_name templatetags (创建Python Packge,注意一定要用templatetags这个名字) my_ ...

  9. Django 自定义模板标签 报错django.template.exceptions.TemplateSyntaxError: '####' is not a registered tag library. Must be one of:

    我写代码遇到这个错误,但是发现程序没有写错,好像是程序有缓存,重新运行几次就好了. 自定义模板标签,可以不用写views,url直接通过自定义函数把变量传给模板. 具体实现: 1.在app下新建Pyt ...

随机推荐

  1. EventProxy流程控制

    EventProxy流程控制 EventProxy是一个通过控制事件触发顺序来控制业务流程的工具. 1. 利用事件机制解耦复杂业务逻辑2. 移除被广为诟病的深度callback嵌套问题3. 将串行等待 ...

  2. iOS--支付宝环境集成

    1.下载支付宝SDK以及Demo https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType= ...

  3. 我在项目中运用 IOC(依赖注入)--实战篇

    上一篇<我在项目中运用 IOC(依赖注入)--入门篇>只是简单的使用 IOC.实际项目使用 IOC 的情景复杂多了,比如说,构造函数有多个参数,有多个类继承同一个接口... Unity都有 ...

  4. IDEA 2019注册码

    N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiO ...

  5. 从 Hadoop 1.0 到 Hadoop 2.0 ,你需要了解这些

    学习大数据,刚开始接触的是 Hadoop 1.0,然后过度到 Hadoop 2.0 ,这里为了书写方便,本文中 Hadoop 1.0 采用 HV1 的缩写方式,Hadoop 2.0 采用 HV2 的缩 ...

  6. 洛谷P4027 [NOI2007]货币兑换(dp 斜率优化 cdq 二分)

    题意 题目链接 Sol 解题的关键是看到题目里的提示... 设\(f[i]\)表示到第\(i\)天所持有软妹币的最大数量,显然答案为\(max_{i = 1}^n f[i]\) 转移为\(f_i = ...

  7. php_soap扩展应用

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  8. SQL注入 payload 记录

    使用 REGEXP盲注 payload select user() from users where user_id=1 and (select(user)from users where user_ ...

  9. 2 python全局变量如何指定(是在模块内,还是函数内)

    示例代码1 xx=1 def __recurrence(): # #前面的0到sentence_length-1的下标,存储的就是最原始的词向量,但是我们也要将其转变为Tensor global xx ...

  10. log4j.properties 配置示例

    需要的jar如下: !-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId> ...