第四章 模版
点语法
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
。对此如何取舍取决你的应用程序。
分享到:
相关推荐
The Django Book,中文版,快速了解Django框架。
Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目...
django-admin-bootstrap-master.zip
django-practice-book-master项目源代码
django-vue-admin发布教程.docx
学习Django框架不二选择,有源码有笔记(思维导图)
3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于...
为支持django3对django_cas_ng进行修改 **Features** - Support CAS version 1.0, 2.0, 3.0 - Support Single Sign Out - Configuration of services via the django Admin application - Fine control on ...
资源分类:Python库 所属语言:Python 资源全名:Django-3.2.11-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
"Beginning Django E-Commerce guides you through producing an e-commerce site using Django, the most popular Python web development framework. Topics covered include how to make a shopping cart, a ...
Python在线考试系统后端-大学毕业设计-基于Django+Django -Rest-Framework 适合大学生计算机专业的毕业设计,课程设计。 Python在线考试系统后端-大学毕业设计-基于Django+Django -Rest-Framework 适合大学生...
Django14-1.4.14-1.sdl6.noarch.rpm Django14-1.4.14-1.sdl6.noarch.rpm
资源分类:Python库 所属语言:Python 资源全名:django-admin-volt-0.0.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python在线考试系统-大学毕业设计-基于Django+Django -Rest-Framework
资源来自pypi官网。 资源全名:Django-3.1.1-py3-none-any.whl
资源分类:Python库 所属语言:Python 资源全名:django-cascading-dropdown-widget-0.2.6.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
django-book-2.0 中文翻译可以抛弃以前的旧版本翻译,本身几乎全部翻译完全,少许停留在80%,文件解压后为*.pdf格式
Daniel-Roy-Greenfeld-Audrey-Roy-Greenfeld-Two-Scoops-of-Django_-Best-Practices-for-Django-1.8-Two-Scoops-Press-2015.pdf 高清无水印版
Django-2.1-py3-none-any.whl 从国外网站下载Django-2.1-py3-none-any.whl太慢了,基本几KB 传上来共享给大家 省的大家自己下了
django-cas-ng, Django ( 中央身份验证服务) 客户端 Django CAS django-cas-ng 是中央认证服务( CAS ) 客户端实现。 这里项目继承自 django-cas ( 自从 2013年04月 之后还没有更新过) 。 NG代表"下一代"。 我们的...