Jun 18, 2011

django Template

用 template 渲染 Context

标准用法
from django.template import Context, Template
t = Template('My name is {{ name }}.')
c = Context({'name': 'Stephane'})
t.render(c)

Template 能以文本或 html 文件为参数创建
Context 以 python dict 为参数创建

简单用法
from django.shortcuts import render_to_response
render_to_response('search_results.html', {'books': books, 'query': q})

Context

Context 是类字典变量,这意味着你可以使用 Python 字典的成员函数

注释

{# This is a comment #}

{% block foo %}, {% endblock %}

template 有继承关系,在父子模板中同时使用如上的tag
则字模板的内容替代父模板的内容
也可以只是添加而不替代
使用 block.super
比如添加html tag 的 class
{% block head-class %}{{ block.super }} float-left {% endblock %}

变量 {{ foo }}, {{ foo.bar }}

变量由 context 传入,context 是一个类字典数据,比如 {'name': 'Stephane'}
则在模板中,{{ name }} 变量替换为 'Stephane'
变量不要求为str,可以是任何 python 数据,数字,list, boolean, 对象都可以,只要它们可以转化为 str

假如 name 是一个对象,{{ name }} 只会打印出类似于如下的信息
<books.views.SomeClass instance at 0x013DB120>
假如 name 是一个 list,我们需要引用它的第一个成员
诸如此类情况,我们需要用变量做一些操作,此时需要使用句点查找规则,它在模板中格式为 {{ foo.bar }}
句点查找规则可概括为: 当模板系统在变量名中遇到点时,按照以下顺序尝试进行查找:

  1. 字典类型查找 (比如 foo["bar"] )
  2. 属性查找 (比如 foo.bar )
  3. 方法调用 (比如 foo.bar() )
  4. 列表类型索引查找 (比如 foo[bar] ),bar 为整数,且不支持负数
使用最先找到的方式。

标签 {% %}

{% if today_is_weekend %}
...
{% else %}
...
{% endif %}

{% for athlete in athlete_list %}
...
{% endfor %}

{% if athlete_list %}
{% for athlete in athlete_list %}
...
{% endfor %}
{% else %}
There are no athletes. Only computer programmers.
{% endif %}
等同于
{% for athlete in athlete_list %}
...
{% empty %}
There are no athletes. Only computer programmers.
{% endfor %}
Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部

{% ifequal user currentuser %}
Welcome!
{% endifequal %}

filter: 改变变量 {{ value|filter:parameter }}

如果你对变量要做一些修改,比如使首字母大写,别忘了使用过滤器 {{ value|capfirst }}
完整标签和过滤器列表

定义自己的标签和过滤器

0 comments: