当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 模版高级进阶

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:19

板库单独创建一个应用。 我们更推荐使用后者,因为你的filter可能在后来的工程中有用。无论你采用何种方式,请确保把你的应用添加到 INSTALLED_APPS 中。 我们稍后会解释这一点。第二,在适当的Django应用包里创建一个 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应用程序中的模板库。 这是一个安全特性;它可以让你在一台电脑上部署很多的模板库的代码,而又不用把它们暴露给每一个Django安装。如果你写了一个不和任何特定模型/视图关联的模板库,那么得到一个仅包含 templatetags 包的Django应用程序包是完全正常的。 对于在 templatetags 包中放置多少个模块没有做任何的限制。 需要了解的是:{%load%}语句是通过指定的Python模块名而不是应用名来加载标签/过滤器的。一旦创建了Python模块,你只需根据是要编写过滤器还是标签来相应的编写一些Python代码。作为合法的标签库,模块需要包含一个名为register的模块级变量。这个变量是template.Library的实例,是所有注册标签和过滤器的数据结构。 所以,请在你的模块的顶部插入如下语句:from django import templateregister = template.Library()注意请阅读Django默认的过滤器和标签的源码,那里有大量的例子。 他们分别为:django/template/defaultfilters.py 和 django/template/defaulttags.py 。django.contrib中的某些应用程序也包含模板库。创建 register 变量后,你就可以使用它来创建模板的过滤器和标签了。自定义模板过滤器自定义过滤器就是有一个或两个参数的Python函数:(输入)变量的值参数的值, 可以是默认值或者完全留空例如,在过滤器 {{ var|foo:"bar" }} 中 ,过滤器 foo 会被传入变量 var 和默认参数 bar。过滤器函数应该总有返回值。 而且不能触发异常,它们都应该静静地失败。 如果出现错误,应该返回一个原始输入或者空字符串,这会更有意义。这里是一些定义过滤器的例子:def cut(value, arg): "Removes all values of arg from the given string" return value.replace(arg, '')下面是一个可以用来去掉变量值空格的过滤器例子:{{ somevariable|cut:" " }}大多数过滤器并不需要参数。 下面的例子把参数从你的函数中拿掉了:def lower(value): # Only one argument. "Converts a string into all lowercase" return value.lower()当你定义完过滤器后,你需要用 Library 实例来注册它,这样就能通过Django的模板语言来使用了:register.filter('cut', cut)register.filter('lower', lower)Library.filter() 方法需要两个参数:过滤器的名称(一个字串)过滤器函数本身如果你使用的是Python 2.4或者更新的版本,你可以使用装饰器register.filter():@register.filter(name='cut')def cut(value, arg): return value.replace(arg, '')@register.filterdef lower(value): return value.lower()如果你想第二个例子那样不使用 name 参数,那么Django会把函数名当作过滤器的名字。下面是一个完整的模板库的例子,它包含一个 cut 过滤器:from django import templateregister = template.Library()@register.filter(name='cut')def cut(value, arg): return value.replace(arg, '')自定义模板标签标签要比过滤器复杂些,因为标签几乎能做任何事情。第四章描述了模板系统的两步处理过程: 编译和呈现。 为了自定义一个模板标签,你需要告诉Django当遇到你的标签时怎样进行这个过程。当Django编译一个模板时,它将原始模板分成一个个 节点 。每个节点都是 django.template.Node 的一个实例,并且具备 render() 方法。 于是,一个已编译的模板就是 节点 对象的一个列表。 例如,看看这个模板:Hello, {{ person.name }}.{% ifequal name.birthday today %} Happy birthday!{% else %} Be sure to come back on your birthday for a splendid surprise message.{% endifequal %}被编译的模板表现为节点列表的形式:文本节点: "Hello, "变量节点: person.name文本节点: ".\n\n"IfEqual节点: name.birthday和today当你调用一个已编译模板的 render() 方法时,模板就会用给定的context来调用每个在它的节点列表上的所有节点的 render() 方法。 这些渲染的结果合并起来,形成了模板的输出。 因此,要自定义模板标签,你需要指明原始模板标签如何转换成节点(编译函数)和节点的render()方法完成的功能 。在下面的章节中,我们将详细解说写一个自定义标签时的所有步骤。编写编译函数当遇到一个模板标签(template tag)时,模板解析器就会把标签包含的内容,以及模板解析器自己作为参数调用一个python函数。 这个函数负责返回一个和当前模板标签内容相对应的节点(Node)的实例。例如,写一个显示当前日期的模板标签:{% current_time %}。该标签会根据参数指定的 strftime 格式(参见:http://www.djangoproject.com/r/python/strftime/)显示当前时间。首先确定标签的语法是个好主意。 在这个例子里,标签应该这样使用:The time is {% current_time "%Y-%m-%d %I:%M %p" %}.注意没错, 这个模板标签是多余的,Django默认的 {% now %} 用更简单的语法完成了同样的工作。 这个模板标签在这里只是作为一个例子。这个函数的分析器会获取参数并创建一个 Node 对象:from django import templateregister = template.Library()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.split_contents()[0] raise template.TemplateSyntaxError(msg) return CurrentTimeNode(format_s

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页


Django 模版高级进阶