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


    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>

  • 相关阅读:
    [C++知识点]2015.4.18
    [COCOS2DX]第一个开源项目的部署和运行<win32版本>
    [COCOS2DX]交叉编译实践+速度优化(vs2012修改win32代码+修改makefile+编译安卓项目包+部署安卓项目包到Eclipse+运行apk)
    [COCOS2DX]COCOS命令新建项目+编译安卓项目并成功运行
    [COCOS2DX]官网helloworld在VS2012中的部署
    【转】int const A::func()和int A::func() const
    【转】Singleton单例模式
    【转】java静态代码块和构造方法执行顺序
    小程序加入阿拉丁统计
    关于固定footer的用法
  • 原文地址:https://www.cnblogs.com/haoshine/p/6014533.html
Copyright © 2020-2023  润新知