全部博文(2065)
分类: Python/Ruby
2009-05-12 19:19:48
if/else
{% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% endif %} 之间的任何内容,例如:
{% if vars %}
welcome to weekend
{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断
,或者对变量取反( not ),例如:
{% if var1 %}
{% if var2 or var3 %} {%endif%} {%endif%}
一定要用 {% endif %} 关闭每一个 {% if %} 标签。否则Django会抛出 TemplateSyntaxError 。 记得要关闭掉标签元素。
for
{% for %} 允许我们在一个序列上迭代。与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。每一次循环中,模板系统会渲染在 {% for %} and {% endfor %} 中的所有内容。
可以进行标签FOR操作!
{% for athlete in athlete_list %}
{% endfor %}
{% for %} 标签在循环中设置了一个特殊的 forloop 模板变量。这个变量能提供一些当前循环进展的信息:forloop.counter 总是一个表示当前循环的执行次数的整数计数器。这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。例子如下:
{%
for item in todo_list %}
{{ forloop.counter }}: {{ item
}}
{%
endfor %}
forloop.revcounter 是表示循环中剩余项的整型变量
forloop.first 是一个布尔值。在第一次执行循环时该变量为True
forloop.last 是一个布尔值;在最后一次执行循环时被置为True
ifequal/ifnotequal
{% ifequal %} 标签比较两个值,当他们相同时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值
{% ifequal user currentuser %}
和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:
象HTML和其他的语言例如python一样,Django模板系统也允许注释。 注释使用 {# #} :注释
过滤器
就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法。 过滤器看起来是这样的:
{{
name|lower }}
显示的内容是变量 {{ name }} 被过滤器 lower 处理后的结果,它功能是转换文本为小写。 使用 | 来应用过滤器。过滤器可以被 串联 ,就是说一个过滤器的输出可以被输入到下一个过滤器。这里有一个常用的 需求,先转义文本到HTML,再转换每行到 标签:
会将一个变量经过过滤器处理之后得到新的变量内容出来也可以经过一联串过滤处理之后显示出来。
{{ my_text|escape|linebreaks }}
下面是一些常用的过滤器:
addslashes :
添加反斜杠到任何反斜杠、单引号或者双引号前面。
这在处理包含JavaScript的文本时是非常有用的。
date :
按指定的格式字符串参数格式化 date 或者 datetime 对象,
范例:
{{
pub_date|date:"F j, Y" }}
理念与局限
(事实上,对一个 Python开发者来说,写一个自己的模板语言就象是某种“成人礼”一样!如果你还没有完成一个自己的 模板语言,好好考虑写一个,这是一个非常有趣的锻炼!)
在视图中使用模板
可以在视图中如下写代码:
from
django.template import Template, Context
from
django.http import HttpResponse
import
datetime
def
current_datetime(request):
now =
datetime.datetime.now()
t = Template("It is
now {{ current_date }}.
") #定义好模板
html = t.render(Context({'current_date':
now}))#应用渲染
return HttpResponse(html)
模板加载
{原则就是要将python代码与HTML设计代码进行分离掉}
将模板系统分离开来:
D:\Python25\Lib\site-packages\django\bin\mysite 新建立一个templates目录专门存放.html的模板
settings.py修改设置
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)
在视图中修改代码如下:
from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context
import datetime
def current_datetime(request):
now = datetime.datetime.now()
t = get_template('current_datetime.html')
html = t.render(Context({'current_date':now}))
return HttpResponse(html)
正如你从图 4-1 中的错误信息中所看到,Django 尝试通过组合 TEMPLATE_DIRS 设置以及传递给 get_template() 的模板名称来查找模板。因此如果 TEMPLATE_DIRS 为 '/home/django/templates' ,Django 将会 查找'/home/django/templates/current_datetime.html' 。如果 TEMPLATE_DIRS 包含多个目录,它将会查找每个目录直至找到模板或找遍所有目录。
from django.shortcuts import render_to_response
import datetime
def current_datetime(request):
now = datetime.datetime.now()
return render_to_response('current_datetime.html',{'current_date':now})
视图函数大变样了!非常简单化
include 模板标签
{% include %} 。该标签允许在(模板中)包含其它的模板的内容。标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。