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

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

  1. from django.shortcuts import render_to_response
  2.  
  3. class Person(object):
  4. def __init__(self, name, age, sex):
  5. self.name = name
  6. self.age = age
  7. self.sex = sex
  8.  
  9. def say(self):
  10. return "This is " + self.name
  11.  
  12. def index(req):
  13. books = {'a':'linux in a nutshell','b':'unix programming'}
  14. user = Person('eli', 24, 'male')
  15. user_list = ['eli', 'lie', 'iel']
  16. return render_to_response('index.html', {'title':'Django Sample', 'context':user, 'users':user_list, 'books':books})

修改 templates/index.html 如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>{{title}}</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  6. <meta name="keywords" content="Django Template" />
  7. <meta name="description" content="Django Template" />
  8. </head>
  9. <body>
  10. <center>{{context.name}}</center>
  11. <center>{{context.say}}</center>
  12. <center>
  13. <li>{{users}}</li>
  14. <li>{{users.0}}</li>
  15. </center>
  16. {% if context %}
  17. <li>test if : user age {{context.age}}</li>
  18. {% else %}
  19. user not found.
  20. {% endif %}
  21.  
  22. {% for user in users %}
  23. <li>User: {{user}}</li>
  24. {% endfor %}
  25.  
  26. {% for k,v in books.items %}
  27. <li>{{forloop.counter}} {{k}}: {{v}}</li>
  28. {% endfor %}
  29. </body>
  30. </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 提供的模板继承,它支持构建一个骨架模板 ,里面包含网站的通用部分,并且在里面定义好可以用子模板覆盖的块:

  1. <!-- 定义基本模板 base.htm -->
  2.  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
  4. <html lang="en">
  5. <head>
  6. <title>{% block title %}{% endblock %}</title>
  7. </head>
  8. <body>
  9. <h1>My helpful timestamp site</h1>
  10. {% block content %}{% endblock %}
  11. {% block footer %}
  12. <hr>
  13. <p>Thanks for visiting my site.</p>
  14. {% endblock %}
  15. </body>
  16. </html>
  1. <!-- index.htm -->
  2.  
  3. {% extends "base.html" %}
  4.  
  5. {% block title %}The current time{% endblock %}
  6.  
  7. {% block content %}
  8. <p>It is now {{ current_date }}.</p>
  9. {% endblock %}

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

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

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

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

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

  1. 1 如果在模板里使用 {% extends %},这个标签必须在所有模板标签的最前面,否则模板继承不工作
  2. 2 通常基本模板里的 {% block %} 越多越好,子模板不必定义所有的父 block,钩子越多越好
  3. 3 如果在很多模板里复制代码,就应该把这些代码移动到父模板里
  4. 4 如果需要得到父模板的块内容,{{ block.super }} 变量可以完成工作,当需要给父块添加内容而不是取代它的时候这就很有用
  5. 5 不能在同一模板里定义多个同名的 {% block %},因为块标签同时在两个地方工作,不仅仅在子模板中,而且在父模板中也填充内容,如果子模板有两个同名的标签,父模板将不能决定使用哪个块内容
  6. 6 {% extends %} 传递的模板名同样会被 get_template() 使用,所以会加上 TEMPLATE_DIRS 设置
  7. 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. DOM基础之“寻找”子节点

    今天学习了JS中的DOM的内容,虽然小菜的理解不深,但希望能够记录下来,慢慢一点一点的进步,有更深的理解了,再回来补充. 首先,关于DOM的概念: 1.概念:DOM = document(文档)Obj ...

  2. 你好,C++(26)如何与函数内部进行数据交换?5.1.3 函数参数的传递

    5.1.3  函数参数的传递 我们知道,函数是用来完成某个功能的相对独立的一段代码.函数在完成这个功能的时候,往往需要外部数据的支持,这时就需要在调用这个函数时向它传递所需要的数据它才能完成这个功能获 ...

  3. linux笔记2.21

    命令dmesg显示本次内核启动信息 init是系统运行的第一个进程 Linux运行级别: 0   关机 1   单用户模式 2   不带网络的多用户模式 3   命令行多用户模式  4   未使用 5 ...

  4. AMH4.2 Ftp账号路径修改设置

    AMH4.2的ftp控制有点不尽如人意,每个ftp账号只能对应一个站点:如果按照面板所提供的权限,有多少个站就得设置多少个ftp账号,这一操作就会非常麻烦,造成效率低下:不过AMH5.0已经能够通过面 ...

  5. Eclipse Android源代码新下载方法及关联

    一.下载Android源代码 Android源代码从4.0后就可以使用SDK Manager进行下载,打开SDK Manager就可以看到,已4.4为例: 关联Android源代码 但是老是提示下载失 ...

  6. Bug解决过程复盘

    反思了下,解决问题无外乎3w1h when where who how 就是查询出来的事情多了,现在不知道哪个地方出问题,应该根据日志一步一步梳理,查看每一步的输出结果是否与预期一致 顺藤摸瓜 觉得不 ...

  7. 【转】单双精度浮点数的IEEE标准格式

    原文网址:http://blog.chinaunix.net/uid-24118190-id-75212.html 单双精度浮点数的IEEE标准格式 关键字:浮点数 IEEE标准 大多数高级语言按照I ...

  8. 【转】Beaglebone Black

    原文网址:http://bbs.eeworld.com.cn/thread-431409-1-1.html 开源硬件在国外火得一塌糊涂,国内却没有那么多人玩,直接导致中文论坛资料严重缺乏……但这也挡不 ...

  9. 【转】Android UI系列-----时间、日期、Toasts和进度条Dialog

    原文网址:http://www.cnblogs.com/xiaoluo501395377/p/3421727.html 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注 ...

  10. Raid1源代码分析--Barrier机制

    本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析.它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/un ...