您的位置:首页 > 编程语言 > Go语言

Django笔记8(模板引擎)

2012-06-10 00:24 363 查看
1.创建一个模板库

(1) 决定哪个Django应用应当拥有这个模板库, 确保把你的应用添加到 INSTALLED_APPS 中

(2) 在适当的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应用程序中的模板库。

要成为有效的标签库,模块必须包含一个模块级的变量: register ,这是一个 template.Library 的实例。这个 template.Library 实例是包含所有已注册的标签及过滤器的数据结构。因此,在模块的顶部位置插入下述代码:

from django import template

register = template.Library()

2. 自定义模板过滤器

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

(输入)变量的值

参数的值, 可以是默认值或者完全留空

例如,在过滤器 {{ var|foo:”bar” }} 中 ,过滤器 foo 会被传入变量 var 和参数 bar 的内容。

过滤器函数应该总有返回值,而且不能触发异常,它们都应该静静的失败。如果有一个错误发生,它们要么返回原始的输入字符串,要么返回空的字符串,无论哪个都可以。

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

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()

这里是一些如何使用过滤器的例子:

{{ somevariable|cut:”0″ }}

当你在定义你的过滤器时,你需要用 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.filter
def lower(value):
return value.lower()

像第二个例子中,如果你不使用 name 参数,那么Django将会使用函数名作为过滤器的名字。

下面是一个完整的模板库的例子,提供了一个 cut 过滤器:

from django import template
register = template.Library()
@register.filter(name='cut')
def cut(value, arg):
return value.replace(arg, '')

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)标签模板


{% for book in books %}

{{ book }}

{% endfor %}

转载请注明来源:http://www.qwolf.com/?p=176
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息