本节介绍模板中的内置标签:if for

承上文,修改 views.py 如下:

from django.shortcuts import render_to_response

class Person(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex def say(self):
return "This is " + self.name def index(req):
books = {'a':'linux in a nutshell','b':'unix programming'}
user = Person('eli', 24, 'male')
user_list = ['eli', 'lie', 'iel']
return render_to_response('index.html', {'title':'Django Sample', 'context':user, 'users':user_list, 'books':books})

修改 templates/index.html 如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{{title}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Django Template" />
<meta name="description" content="Django Template" />
</head>
<body>
<center>{{context.name}}</center>
<center>{{context.say}}</center>
<center>
<li>{{users}}</li>
<li>{{users.0}}</li>
</center>
{% if context %}
<li>test if : user age {{context.age}}</li>
{% else %}
user not found.
{% endif %} {% for user in users %}
<li>User: {{user}}</li>
{% endfor %} {% for k,v in books.items %}
<li>{{forloop.counter}} {{k}}: {{v}}</li>
{% endfor %}
</body>
</html>

详细用法参见官方文档:https://docs.djangoproject.com/en/1.5/ref/templates/builtins/

2015-2-5 补充:

include 模板标签

{% include 'template.htm' %},在模板中载入另一个模板。

block 模板继承

{% extends %} {% block %}

实际开发中,需要减少一个常见页面区域的重复和冗余(如全站导航)。解决这个问题的经典方式是使用服务器端引入和导向,可以在 HTML 里面嵌套另一个页面。上面介绍的 include 方法就是这种方案。

模板引入能很好的解决 header 和 footer 等需求,但对于 body 内的各个块就不是很好解决。更好的解决这个问题的方法是 Django 提供的模板继承,它支持构建一个骨架模板 ,里面包含网站的通用部分,并且在里面定义好可以用子模板覆盖的块:

<!-- 定义基本模板 base.htm -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
</html>
<!-- index.htm -->

{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}

这个方法最大化了代码重用并且很容易向公用区域添加东西,例如部分专有的导航。使用继承的常用方式是按以下三个步骤:

1 创建 base.htm 模板来网站的整体外观,它的内容很少改变。

2 创建 base_SECTION.htm 模板,如 base_photos.html,base_forum.html 这些模板继承 base.html 且包括部分专有的风格和设计。

3 为每个类别的页面创建单独的模板,例如论坛页面、照片图库页面,这些模板继承相应的部分模板。

下面是一些关于模板继承的小提示:

1 如果在模板里使用 {% extends %},这个标签必须在所有模板标签的最前面,否则模板继承不工作
2 通常基本模板里的 {% block %} 越多越好,子模板不必定义所有的父 block,钩子越多越好
3 如果在很多模板里复制代码,就应该把这些代码移动到父模板里
4 如果需要得到父模板的块内容,{{ block.super }} 变量可以完成工作,当需要给父块添加内容而不是取代它的时候这就很有用
5 不能在同一模板里定义多个同名的 {% block %},因为块标签同时在两个地方工作,不仅仅在子模板中,而且在父模板中也填充内容,如果子模板有两个同名的标签,父模板将不能决定使用哪个块内容
6 向 {% extends %} 传递的模板名同样会被 get_template() 使用,所以会加上 TEMPLATE_DIRS 设置
7 大部分情况下,{% extends %} 的参数是 string,但是也可以是变量,如果直到运行时才知道父模板的名字,这可以做一些很 cool 的动态内容

django: template - built-in tags的更多相关文章

  1. The Django template language 阅读批注

    The Django template language About this document This document explains the language syntax of the D ...

  2. Django.template框架 template context (非常详细)

    前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的 这会导致几个问题: 1,显然,任何页面的改动会牵扯到Python代码的改动 网站的设计改动会比Python代码改 ...

  3. Django Template(模板)

    一.模板组成 组成:HTML代码 + 逻辑控制代码 二.逻辑控制代码的组成 1.变量 语法格式 : {{ name }} # 使用双大括号来引用变量 1.Template和Context对象(不推荐使 ...

  4. Django Template 进阶

    回顾: Variables {{ var }} {{ dict.key }} {{ var.attr }} {{ var.method }} {{ varindex }} Filter {{ list ...

  5. django template

    一.模板基本元素 1.例子程序 1)urls.py中新增部分 from django.conf.urls import patterns, url, include urlpatterns = pat ...

  6. django: template using & debug

    模板的作用方法有如下三种: blog/views.py: from django.template import loader, Context, Template from django.http ...

  7. django: template variable

    模板变量用双大括号显示,如: <title>page title: {{title}}</title> 一 模板中使用变量 继续前面的例子,修改 index.html: < ...

  8. Django Template模板

    Django Template 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python 代码之中. 下面我们来调用html views def ind ...

  9. django.template.exceptions.TemplateDoesNotExist: rest_framework/api.html

    django.template.exceptions.TemplateDoesNotExist: rest_framework/api.html setting文件中的 INSTALLED_APPS加 ...

随机推荐

  1. [!] Unable to satisfy the following requirements:

    出现这个问题是由于我本地Podfile文件上第三方版本太低. 解决方案就是,更新一下本地Podfile文件上的第三方版本,也就是pod update --verbose一下. 注意一下,这个命令需要很 ...

  2. Php OpenID

    也许大家都有这样的经历与烦恼:当你为了使用某个网站的服务时(若你还没在该网站上注册过),你不得不先注册一个帐号.当你在一堆的网站上注册帐号后,你必需面临管理这些帐号的烦恼.也许你会这样考虑,不同网站注 ...

  3. C++小技巧之四舍五入与保留小数

    四舍五入:保留整数 int a = b+0.5; 保留一位小数  int a=(b+0.05)*10; double c=a/10; 保留二位小数  int a=(b+0.005)*100; doub ...

  4. JQuery 表单验证--jquery validation

    jquery validation,表单验证控件 官方地址 :http://jqueryvalidation.org/ jquery表单验证 默认值校验规则 jquery表单验证 默认的提示 < ...

  5. 武汉科技大学ACM :1007: 华科版C语言程序设计教程(第二版)习题7.10

    Problem Description 输入n(n<100)个字符串,每个字符串长度不超过1000,将他们按字典顺序输出. Input 多组测试样例. 每组第一行有一个整数n表示有n个字符串. ...

  6. DOM动态添加表格

    var table=document.createElement("table"); table.border=1; var b=document.createElement(&q ...

  7. /etc/host 配置主机名字

    每个机子中的hosts文件都应有下面域IP对应的文件

  8. wdcp/wdlinux一键包的php5.3版本添加Zend.so 和Soap.so

    Wdcp 安装soap扩展 1.首先进入 soap模块的安装文件,wdcp安装包解压对应的php中有,如:/root/miloxi/lanmp/php-5.5.10/ext/soap 2.执行: (1 ...

  9. MySQL 插入数据时,中文乱码???问题的解决

    在终端,mysql -u root -p 登录: show variables like 'character%'; 来查看当前数据库的相关编码集. client 为客户端使用的字符集. connec ...

  10. C++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数

    构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数 ...