Pyhton_Django学习笔记(四) 模板

模板的简单使用,先上代码:

from django import template
= template.Template('My name is {{ name }}.')
= template.Context({'name':'nick'})
print t.render(c)

创建一个Template对象,实例化。默认构造参数 直接接受字符串作为模板内容。

其中{{}}表示模板的变量。

一旦你创建了Template模板实例,你可以用Context来传递参数给它。

格式 Context({'name':'nick'}) 第一个参数为模板变量的映射,第二个为要传递的值。并以 “:”分开,如果是多个集合用“,”分隔。

最后调用Template对象的 render()方法,并用context对象来填充模板。

同一个模板对象,可对应多个上下文对象。

 

如果遍历一个结构对象,可以使用如下方法。

from django.template import Template,Context
person 
= {'name':'sally','age':'43'}
= Template('{{ person.name }} is {{ person.age }} years old.')
= Context({'person':person})
t.render(c)


在模板的方法调用中,有一个操作流程是需要注意的。

 在查找方法的过程中,如果方法抛出了一个异常,除非该异常有一个silent_variable_failure属性,别且值为true,否则它将继续传播。

举例:例如你有一个 BankAccount 对象,有一个Del()方法。

如果某个模板包含了 {{ account.del }} 的标签,account是BankAccount的一个实例。这个模板载入时,account对象被删除。

防止这样的事情发生,必须设置 alters_data函数.

def Del(self)
      Del.alters_data 
= True

 模板不会执行任何以该方式进行标记的方法。

 

模板中得注释,使用 {#  注释内容  #} 该注释不能跨行。

如果跨行,需要使用模板标记 

{% comment %} 

注释内容

 

{% endcomment %}

 =====================================================================================

 

在视图中使用模板

 

 模板加载机制

 打开settings.py文件,找到TEMPLATE_DIRS这项设置。

 添加一个用于存放模板的路径,如下:

 

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

如果考虑到以后部署等问题,可以使用动态的路径方法如:

 

import os.path

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

 

 

 设置好模板路径后

 

 在项目路径下,创建文件夹  templates

 在文件下创建一个HTML页面文件template1.html,内容如下:

 

<html><body>现在的时间是: {{ nowtime }}.</body></html>

然后创建一个 视图函数 代码如下

 

from django.http import HttpResponse
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,看效果吧。

 

再记录个 简化模板处理的方法。

from django.shortcuts import render_to_response
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模板:

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
    
<head>
        
<title>{% block title %}{% endblock %}</title>
    
</head>
    
<body>
        
<h1>我得时间表</h1>
        {% block content %}{% endblock %}
        {% block footer %}
        
<hr>
        
<p>谢谢对网站的支持</p>
        {% endblock %}
    
</body>
</html>

 创建子模板  test.html

{% extends "base.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 %}的参数应该是字符串,但如果想实现动态的父模板名,这个参数可以是变量。

 

 


posted on 2011-07-05 18:45  超级管理员  阅读(2139)  评论(0编辑  收藏  举报