跳至主要內容

03-如何编写自定义的模板标签和过滤器

AI悦创原创django体系课django体系课大约 4 分钟...约 1341 字

你好,我是悦创。

Django 模板语言包含了很多 内置 tags 和 filtersopen in new window,设计目的是满足应用需要占位逻辑需求。极少情况下,你可能发现需要的功能未被核心模板集覆盖。你能通过 Python 代码自定义 tags 和 filters 扩展集成模板引擎,通过 {% load %}open in new window 标签使其可用。

1. 代码布局

定制自定义模板 tags 和 filters 的位置就是 Django 应用内。如果它们关联至某个已存在的应用,在那里将它们打包就很有用;否则,它们能被添加至新应用。当一个 Django 应用被添加至 INSTALLED_APPSopen in new window,所以其在常规位置(下面介绍)定义的标签都可以在模板中自动加载。

该应用应包含一个 templatetags 目录,与 models.pyviews.py 等同级。若该目录不存在,创建它——不要忘了用 __init__.py 文件确保目录被视作一个 Python 包。

开发服务器并不会自动重启

添加 templatetags 模块后,你需要重启服务器,这样才能在模板中使用 tags 和 filters。

自定义的 tags 和 filters 会保存在模块名为 templatetags 的目录内。模块文件的名字即稍候你用来加载 tags 的名字,所以小心不要采用一个可能与其它应用自定义的 tags 和 filters 冲突的名字。

例如,如果你的 tags/filters 保存在一个名为 poll_extras.py 的文件中,你的应用布局可能看起来像这样:

polls/
    __init__.py
    models.py
    templatetags/
        __init__.py
        poll_extras.py
    views.py

在模板中你会使用以下代码:

{% load poll_extras %}

为了使 {% load %}open in new window 标签生效,包含自定义标签的应用必须包含在 INSTALLED_APPSopen in new window 中。这是个安全特性:它允许你在一个主机上持有多个模板库,而不是让每个 Django 安装都能访问所有的库。

我们并未限制放入 templatetags 包中的模块数量。只需牢记 {% load %}open in new window 语句会加载名字指定 Python 模块的 tags/filters,而不是应用。

要成为一个可用的 tag 库,模块必须包含一个名为 register 的模块级变量,它是一个 template.Library 实例。所有的 tags 和 filters 均在其中注册。所以,在模块的开始,输入以下内容:

from django import template

register = template.Library()

或者,模板标签模块能通过 DjangoTemplatesopen in new window'libraries' 参数注册。这在加载模板名字时,想为模板标签起个别名时很有用。这也让你能在未安装应用的情况下注册标签。

幕后

For a ton of examples, read the source code for Django's default filters and tags. They're in django/template/defaultfilters.pyopen in new window and django/template/defaulttags.pyopen in new window, respectively.

更多关于 loadopen in new window 标签的信息,阅读本文档。

2. 编写自定义的模板过滤器

自定义的过滤器就是一些有一到两个参数的 Python 函数:

  • (输入的)变量的值,不一定得是字符串类型
  • 而参数的值,它们可以有一个默认值,或者被排除在外

举个例子,在过滤器 {{ var|foo:"bar" }} 中,变量 var 和参数 bar 会传递给过滤器 foo

因为模板语言不提供异常处理机制,所以任何从模板过滤器中抛出的异常都将被视为服务器异常。因此,如果有一个合理的返回值将要被返回的话,过滤器函数应当避免产生异常。万一模板中出现有明显错误的输入,产生异常也仍然比隐藏这个 bug 要好。

这是一个过滤器定义的例子:

def cut(value, arg):
    """Removes all values of arg from the given string"""
    return value.replace(arg, '')

这个例子展示了如何使用这个过滤器:

{{ somevariable|cut:"0" }}

大部分的过滤器并没有参数。这样的话,只需要把这些参数从你的函数中去掉就好。

def lower(value): # Only one argument.
    """Converts a string into all lowercase"""
    return value.lower()

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度