`

django book-学习笔记(第四章)

阅读更多

 

第四章 模版

 

点语法

1、用来引用对象的* 方法*。 

 

>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
u'123 -- 123 -- True'
 

注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的方法。

 

 

2、可用于访问列表索引,例如:

 

>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
u'Item 2 is carrots.'
 

Python 列表类型

一点提示: Python的列表是从0开始索引。 第一项在索引0位置上,第二项在索引1位置上,依此类推。

句点查找规则可概括为: 当模板系统在变量名中遇到点时,按照以下顺序尝试进行查找:

<!--[if !supportLists]-->·         <!--[endif]-->字典类型查找 (比如 foo["bar"] )

<!--[if !supportLists]-->·         <!--[endif]-->属性查找 (比如 foo.bar )

<!--[if !supportLists]-->·         <!--[endif]-->方法调用 (比如 foo.bar() )

<!--[if !supportLists]-->·         <!--[endif]-->列表类型索引查找 (比如 foo[bar] )

系统使用所找到的第一个有效类型。 这是一种短路逻辑。

 

 

 

给标签增加一个 reversed 使得该列表被反向迭代:

 

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


在执行循环之前先检测列表的大小是一个通常的做法,当列表为空时输出一些特别的提示。

 

{% if athlete_list %}
    {% for athlete in athlete_list %}
        <p>{{ athlete.name }}</p>
    {% endfor %}
{% else %}
    <p>There are no athletes. Only computer programmers.</p>
{% endif %}
 

因为这种做法十分常见,所以"for" 标签支持一个可选的" {% empty %}"分句,通过它我们可以定义当列表为空时的输出内容 下面的例子与之前那个等价:

 

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}
 

Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。

 

 

 

 

forloop.counter 总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1

 

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
 

forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0

forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1

forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1

forloop.first 是一个布尔值。 在第一次执行循环时该变量为True,在下面的情形中这个变量是很有用的。

 

{% for object in objects %}
    {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
    {{ object }}
    </li>
{% endfor %}

forloop.parentloop 是一个指向当前循环的上一级循环的 forloop 对象的引用(在嵌套循环的情况下)。

 

 

只有模板变量,字符串,整数和小数可以作为 {% ifequal %} 标签的参数。

 

 

 

如果要实现多行注释,可以使用"{% comment %}" 模板标签,就像这样

 

{% comment %}
This is a
multi-line comment.
{% endcomment %}
 

 

 

过滤器的参数跟随冒号之后并且总是以双引号包含。 例如

 

{{ bio|truncatewords:"30" }}
 

 

Python 要求单元素元组中必须使用逗号,以此消除与圆括号表达式之间的歧义。 这是新手常犯的错误。

 

 

如果使用的是 Windows 平台,请包含驱动器符号并使用Unix风格的斜杠(/)而不是反斜杠(),就像下面这样:

 

TEMPLATE_DIRS = (
    'C:/www/django/templates',
)
 

最省事的方式是使用绝对路径(即从文件系统根目录开始的目录路径)。 如果想要更灵活一点并减少一些负面干扰,可利用 Django 配置文件就是 Python 代码这一点来动态构建 TEMPLATE_DIRS 的内容,如: 例如:

 

import os.path
 
TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)
 

这个例子使用了神奇的 Python 内部变量 __file__ ,该变量被自动设置为代码所在的 Python 模块文件名。 " os.path.dirname(__file__)" 将会获取自身所在的文件,即settings.py 所在的目录,然后由os.path.join 这个方法将这目录与 templates 进行连接。如果在windows下,它会智能地选择正确的后向斜杠进行连接,而不是前向斜杠”/”

 

 

 

render_to_response()

 

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

 

 

 

locals() 技巧

思考一下我们对 current_datetime 的最后一次赋值:

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})
 

很多时候,就像在这个范例中那样,你发现自己一直在计算某个变量,保存结果到变量中(比如: 前面代码中的 now ),然后将这些变量发送给模板。特别懒的程序员可能注意到给这些临时变量 模板变量命名显得有点多余。

如果你是个喜欢偷懒的程序员并想让代码看起来更加简明,可以利用 Python 的内建函数 locals() 。它返回的字典对所有局部变量的名称与值进行映射。 因此,前面的视图可以重写成下面这个样子:

def current_datetime(request):
    current_date = datetime.datetime.now()
    return render_to_response('current_datetime.html', locals())
 

在此,我们没有像之前那样手工指定 context 字典,而是传入了 locals() 的值,它囊括了函数执行到该时间点时所定义的一切变量。 因此,我们将 now 变量重命名为 current_date ,因为那才是模板所预期的变量名称。 在本例中, locals() 并没有带来多 的改进,但是如果有多个模板变量要界定而你又想偷懒,这种技术可以减少一些键盘输入。

使用 locals() 时要注意是它将包括 所有 的局部变量,组成它的变量可能比你想让模板访问的要多。 在前例中, locals() 还包含了 request 。对此如何取舍取决你的应用程序。

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics