Pyhton_Django学习笔记(四) 模板
模板的简单使用,先上代码:
t = template.Template('My name is {{ name }}.')
c = template.Context({'name':'nick'})
print t.render(c)
创建一个Template对象,实例化。默认构造参数 直接接受字符串作为模板内容。
其中{{}}表示模板的变量。
一旦你创建了Template模板实例,你可以用Context来传递参数给它。
格式 Context({'name':'nick'}) 第一个参数为模板变量的映射,第二个为要传递的值。并以 “:”分开,如果是多个集合用“,”分隔。
最后调用Template对象的 render()方法,并用context对象来填充模板。
同一个模板对象,可对应多个上下文对象。
如果遍历一个结构对象,可以使用如下方法。
person = {'name':'sally','age':'43'}
t = Template('{{ person.name }} is {{ person.age }} years old.')
c = Context({'person':person})
t.render(c)
在模板的方法调用中,有一个操作流程是需要注意的。
在查找方法的过程中,如果方法抛出了一个异常,除非该异常有一个silent_variable_failure属性,别且值为true,否则它将继续传播。
举例:例如你有一个 BankAccount 对象,有一个Del()方法。
如果某个模板包含了 {{ account.del }} 的标签,account是BankAccount的一个实例。这个模板载入时,account对象被删除。
防止这样的事情发生,必须设置 alters_data函数.
Del.alters_data = True
模板不会执行任何以该方式进行标记的方法。
模板中得注释,使用 {# 注释内容 #} 该注释不能跨行。
如果跨行,需要使用模板标记
注释内容
=====================================================================================
在视图中使用模板
模板加载机制
打开settings.py文件,找到TEMPLATE_DIRS这项设置。
添加一个用于存放模板的路径,如下:
如果考虑到以后部署等问题,可以使用动态的路径方法如:
TEMPLATE_DIRS = ( os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'), )
设置好模板路径后
在项目路径下,创建文件夹 templates
在文件下创建一个HTML页面文件template1.html,内容如下:
然后创建一个 视图函数 代码如下
from django.template import Template,Context
from django.template.loader import get_template
import datetime
def current_datetime(request):
now = datetime.datetime.now()
t = get_template('template1.html')
c = Context({'nowtime':now})
html = t.render(c)
return HttpResponse(html)
运行SERVER,看效果吧。
再记录个 简化模板处理的方法。
import datetime
def current_datetime(request):
now = datetime.datetime.now()
return render_to_response('template1.html',{'nowtime':now})
========================================================================================
include 模板标签
{% include %} 允许在模板中包含其它模板的内容。
标签的参数可以是:模板名称 、变量、字符串。
{% include 'nav.html' %}
{% include 'includes/nav.html' %}
{% include template_name %}
模板继承
本质上说:模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点共用部分和定义进行重载。
创建 base.html模板:
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>我得时间表</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>谢谢对网站的支持</p>
{% endblock %}
</body>
</html>
创建子模板 test.html
{% block title %}现在时间{% endblock %}
{% block content %}
<p>现在时间是:{{nowtime}}</p>
{% endblock %}
省略 视图函数。
因为子模板没有定义 footer 块。所以使用父模板中定义的值。
你可以根据需要使用任意多的继承次数,使用继承的一种常见方式如下三层法则。
1. 创建base.html模板,在其中定义站点的主要外观感受。这些都是不常修改甚至从不修改的内容。
2. 为网站的每个区域创建 base_SECTION.html模板(例如,base_photos.html和base_forum.html) 。
这些模板对base.html进行拓展,并包含区域特定的风格与设计。
3. 为每种类型的页面创建独立的模板,例如论坛页或图片库。这些模板扩展相应的区域模板。
使用模板的一些诀窍
- 如果在模板中使用{% extends %},必须保持其为模板中的第一个模板标记。否则,模板继承将不起作用。
- 一般来说,基础模板中得{% block %}标签越多越好。子模板不必定义父模板中所有的代码块,因此你可以
合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行重载。 - 如果发现自己在多个模板之间拷贝代码,你应该考虑将该代码放置到父模板的某个 {% block %}中。
- 如果你需要访问父模板中块的内容,使用{{ block.super }}这个标签。
- 主要不要在同一个模板中定义同名的{% block %}.
- {% extends %}对所传入模板名称使用的加载方法和get_template()相同。
- 多数情况下,{% extends %}的参数应该是字符串,但如果想实现动态的父模板名,这个参数可以是变量。