ySJ
|
2.0/chapter09/#591 |
2010-04-16 16:46:20
|
在Python 2.4中,也可以使用装饰器语法:
|
|
ySJ
|
2.0/chapter09/#586 |
2010-04-16 16:45:47
|
为了简化这类标签,Django提供了一个帮助函数<literal>simple_tag</literal>。这个函数是<literal>django.template.Library</literal>的一个方法,它接受一个只有一个参数的函数作参数,把它包装在render函数和之前提及过的其他的必要单位中,然后通过模板系统注册标签。
|
|
ySJ
|
2.0/chapter09/#584 |
2010-04-16 16:37:20
|
我们给定了一个格式化字符串,然后它返回一个字符串形式的时间。
|
|
ySJ
|
2.0/chapter09/#583 |
2010-04-16 16:36:47
|
例如,我们先前写的<literal>current_time</literal>标签就是这样一个例子。
|
|
ySJ
|
2.0/chapter09/#582 |
2010-04-16 16:36:16
|
许多模板标签接收单一的字符串参数或者一个模板变量引用,然后独立地根据输入变量和一些其它外部信息进行处理并返回一个字符串。
|
|
ySJ
|
2.0/chapter09/#570 |
2010-04-16 16:34:42
|
例如,这个自定义模板标签<literal>{% upper %}</literal>,它会把它自己和<literal>{% endupper %}</literal>之间的内容变成大写:
|
|
ySJ
|
2.0/chapter09/#570 |
2010-04-16 16:34:33
|
例如,这个自定义模板标签<literal>{% upper %}</literal>,它会把它自己和<literal>{% endupper %}</literal>之间的内容编程大写:
|
|
ySJ
|
2.0/chapter09/#570 |
2010-04-16 16:32:13
|
例如,这个自定义模板标签<literal>{% upper %}</literal>,它会把它自己和<literal>{% endupper %}</literal>之间的内容首字母大写:
|
|
ySJ
|
2.0/chapter09/#568 |
2010-04-16 16:30:36
|
在前一个例子中, <literal>do_comment()</literal> 抛弃了<literal>{% comment %}</literal> 和 <literal>{% endcomment %}</literal> 之间的所有内容。当然也可以修改和利用下标签之间的这些内容。
|
|
ySJ
|
2.0/chapter09/#566 |
2010-04-16 16:28:16
|
分析直至另外一个模板标签并保存内容
|
|
ySJ
|
2.0/chapter09/#557 |
2010-04-16 16:26:43
|
它返回一个<literal>django.template.NodeList</literal>实例,它是一个包含了所有<emphasis>Node</emphasis>对象的列表,这些对象是解析器在解析到任一元组中指定的标签之前遇到的内容.
|
|
ySJ
|
2.0/chapter09/#556 |
2010-04-16 16:22:35
|
<literal>parser.parse()</literal> 接收一个包含了需要分析的模板标签名的元组作为参数。
|
|
ySJ
|
2.0/chapter09/#548 |
2010-04-16 16:19:31
|
分析直至另一个模板标签
|
|
ySJ
|
2.0/chapter09/#529 |
2010-04-16 16:10:42
|
(我们把创建函数<literal>do_current_time2</literal>和注册给<literal>current_time2</literal>模板标签的工作留作读者练习。)
|
|
ySJ
|
2.0/chapter09/#529 |
2010-04-16 16:03:33
|
(我们把创建函数<literal>do_current_time2</literal>和注册给<literal>current_time2</literal>模板标签的工作留给读者练习。)
|
|
brightconan
|
2.0/chapter20/#140 |
2010-04-16 15:54:39
|
让我们来看看如果我们使用模板系统重写我们的例子会发生什么
|
|
ySJ
|
2.0/chapter09/#514 |
2010-04-16 15:49:53
|
和注册过滤器类似,也可以在Python2.4及其以上版本中使用 <literal>register.tag</literal>装饰器:
|
|
clj
|
2.0/chapter20/#198 |
2010-04-16 15:30:58
|
不要直接在cookie中保存数据
|
|
ySJ
|
2.0/chapter09/#505 |
2010-04-16 15:24:00
|
例如:
|
|
ySJ
|
2.0/chapter09/#504 |
2010-04-16 15:23:44
|
只需实例化一个 <literal>template.Library</literal> 实例然后调用它的 <literal>tag()</literal> 方法。
|
|
ySJ
|
2.0/chapter09/#502 |
2010-04-16 15:21:41
|
最后,你需要用你模块的<literal>Library</literal> 实例注册这个标签。
|
|
ySJ
|
2.0/chapter09/#498 |
2010-04-16 15:20:24
|
模板标签只允许在编译的时候抛出错误。
|
|
ySJ
|
2.0/chapter09/#497 |
2010-04-16 15:18:28
|
与模板过滤器一样,这些渲染函数应该静静地捕获错误,而不是抛出错误。
|
|
ySJ
|
2.0/chapter09/#494 |
2010-04-16 15:16:07
|
这两个函数( <literal>__init__()</literal> 和 <literal>render()</literal> )与模板处理中的两步(编译与渲染)直接对应。
|
|
ySJ
|
2.0/chapter09/#481 |
2010-04-16 15:12:48
|
<literal>token.split_contents()[0]</literal><emphasis>总是</emphasis>记录标签的名字,就算标签没有任何参数。
|
|
ySJ
|
2.0/chapter09/#478 |
2010-04-16 15:02:57
|
这个函数可以抛出 <literal>django.template.TemplateSyntaxError</literal> ,这个异常提供所有语法错误的有用信息。
|
|
ySJ
|
2.0/chapter09/#476 |
2010-04-16 14:58:24
|
它不够健壮,因为它只是简单的按照所有空格进行拆分,包括那些引号引起来的字符串中的空格。
|
|
ySJ
|
2.0/chapter09/#475 |
2010-04-16 14:57:51
|
应该避免使用 <literal>token.contents.split()</literal> (仅使用Python的标准字符串拆分)。
|
|
ySJ
|
2.0/chapter09/#474 |
2010-04-16 14:21:16
|
<literal>token.split_contents()</literal> 方法按空格拆分参数同时保证引号中的字符串不拆分。
|
|
ySJ
|
2.0/chapter09/#469 |
2010-04-16 14:16:29
|
<literal>token</literal>是正在被解析的语句。
|
|
ySJ
|
2.0/chapter09/#467 |
2010-04-16 14:14:53
|
每个标签编译函数有两个参数,<literal>parser</literal>和<literal>token</literal>。<literal>parser</literal>是模板解析器对象。
|
|
ySJ
|
2.0/chapter09/#465 |
2010-04-16 14:11:58
|
这里需要说明的地方很多:
|
|
ySJ
|
2.0/chapter09/#454 |
2010-04-16 14:09:33
|
在这个例子里,标签应该这样使用:
|
|
ySJ
|
2.0/chapter09/#453 |
2010-04-16 13:58:00
|
例如,写一个显示当前日期的模板标签:{% current_time %}。该标签会根据参数指定的 strftime 格式(参见:<literal>http://www.djangoproject.com/r/python/strftime/</literal>)显示当前时间。首先确定标签的语法是个好主意。
|
|
ammonddp
|
2.0/chapter13/#386 |
2010-04-16 13:56:51
|
要创建一个站点地图,你只需要写一个<literal> Sitemap</literal> 类,并且在URLconf中指向它。
|
|
ySJ
|
2.0/chapter09/#444 |
2010-04-16 13:50:52
|
因此,要自定义模板标签,你需要指明原始模板标签如何转换成<literal>节点</literal>(编译函数)和节点的<literal>render()</literal>方法完成的功能 。
|
|
ammonddp
|
2.0/chapter13/#513 |
2010-04-16 13:48:26
|
<literal> django.contrib.sitemaps.views.index</literal> 和<literal> django.contrib.sitemaps.views.sitemap</literal> |
|
ammonddp
|
2.0/chapter13/#545 |
2010-04-16 13:46:00
|
<reference name="Chapter 14" refuri="../chapter14/"> 第十四章</reference> 查看创建用户自定义站点需要的工具
|
|
ySJ
|
2.0/chapter09/#443 |
2010-04-16 13:27:54
|
这些渲染的结果合并起来,形成了模板的输出。
|
|
ySJ
|
2.0/chapter09/#442 |
2010-04-16 13:23:58
|
当你调用一个已编译模板的 <literal>render()</literal> 方法时,模板就会用给定的context来调用每个在它的节点列表上的所有节点的 <literal>render()</literal> 方法。
|
|
ySJ
|
2.0/chapter09/#440 |
2010-04-16 13:22:08
|
<literal>name.birthday</literal>和<literal>today</literal> |
|
ySJ
|
2.0/chapter09/#439 |
2010-04-16 13:21:32
|
IfEqual节点:
|
|
ySJ
|
2.0/chapter09/#437 |
2010-04-16 13:20:56
|
<literal>".\n\n"</literal> |
|
ySJ
|
2.0/chapter09/#436 |
2010-04-16 13:20:26
|
文本节点:
|
|
ySJ
|
2.0/chapter09/#434 |
2010-04-16 13:20:07
|
<literal>person.name</literal> |
|
ySJ
|
2.0/chapter09/#433 |
2010-04-16 13:19:45
|
变量节点:
|
|
ySJ
|
2.0/chapter09/#428 |
2010-04-16 13:19:25
|
被编译的模板表现为节点列表的形式:
|
|
ySJ
|
2.0/chapter09/#431 |
2010-04-16 13:18:32
|
<literal>"Hello, "</literal> |
|
ySJ
|
2.0/chapter09/#424 |
2010-04-16 13:17:43
|
于是,一个已编译的模板就是 <literal>节点</literal> 对象的一个列表。
|
|
ySJ
|
2.0/chapter09/#421 |
2010-04-16 13:16:46
|
为了自定义一个模板标签,你需要告诉Django当遇到你的标签时怎样进行这个过程。
|
|