Template

不能直接将html硬编码到视图里的原因:

  • 对页面设计进行的任何改变都必须对python 代码进行相应的修改。站点设计的修改往往比底层python 代码的修改要频繁的多,因此如果可以在不进行python代码修改的情况下变更设计,将会方便很多
  • python代码编写和HTML设计是两个不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员来完成,设置者和HTML/CSS的编码人员都不应该被要求去编辑python的代码来完成他们的工作
  • 程序员编写python代码和设计人员制作模板两个工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个即包含python有包含HTML的文件进行编辑工作

Django 模板基本语法

>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'Stephane'})
>>> t.render(c)
u'My name is Stephane.'
# {{ }} 内表示变量

一旦有了模板对象,就可以通过它渲染多个context

>>> from django.template import Template, Context
>>> t = Template('Hello, {{ name }}')
>>> print t.render(Context({'name': 'John'}))
Hello, John
>>> print t.render(Context({'name': 'Julie'}))
Hello, Julie
>>> print t.render(Context({'name': 'Pat'}))
Hello, Pat

无论何时我们都可以想这样使用同一个模板渲染多个context,只进行一次模板创建后多次调用render()方法效率会更高:

# Bad
for name in ('John', 'Julie', 'Pat'):
t = Template('Hello, {{ name }}')
print t.render(Context({'name': name})) # Good
t = Template('Hello, {{ name }}')
for name in ('John', 'Julie', 'Pat'):
print t.render(Context({'name': name}))

深度变量的查找

在Django 模板中遍历复杂数据结构的关键是 点字符(.)

假设要向模板传递一个python字典要通过字典键访问该字典的值,可使用一个句点

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

同样,也可以通过句点来访问对象的属性

不如python 的datatime.data对象有year,month和day几个属性,同样可以在模板中使用句点来访问这些属性

>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
u'The month is 5 and the year is 1993.'

这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适用于任意的对象

>>> from django.template import Template, Context
>>> class Person(object):
... def __init__(self, first_name, last_name):
... self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
u'Hello, John Smith.'

点语法也可以用来引用对象的 方法。

例如:每个python 字符串都有upper()和isdigit()方法,可以在模板中使用同样的句点语法来调用它们:

>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
>>> t.render(Context({'var': ''}))
u'123 -- 123 -- True'

这里调用方法时并没有使用圆括号,而且也无法给该方法传递参数,只能调用不需要参数的方法。

句点也可用于访问列表索引

>>> 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.'

include 模板标签

{% include %} 内建模板标签,该标签允许在(模板中)包含其它的模板的内容。标签的参数是所要包含的模版名称,可以是一个变量,也可以是用引号硬编码的字符串。

在模板中 双引号和单引号是等价的。

模板继承

可以在HTML页面中使用include指令将一个页面嵌入到另一个中。

本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。

Django 的模板继承系统,可以将其视为服务器端include的逆向思维版本。你可以对那些不同的代码进行定义,而不是共同代码

第一步,定义基础模板,该框架之后将由子模板所继承。

<!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>

{% block xxx %} {% endblock %} 内部为子模板可变内容(非继承),xxx名字可以随便,但是子模板必须使用这个名字进行自定义的改变。

第二步,在子模板中引用

{% extends "base.html" %}    # extends 为继承关键字 ,后面为所需要基础的父模板名

{% block title %}The current time{% endblock %}    #可自定义内容

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

这种方法可以进行传递,即孙可以继承子模板的也可以继承父模板的。

使用模板常见的三层法:

  • 创建base.html 模板,在其中定义站点的主要外观感受。这些部分是不经常修改甚至从不修改
  • 为站点的每个区域创建base_SECTION.html 模板,这些模板对base.html 进行拓展,并包含区域特定的风格于设计
  • 为每种类型的页面创建独立的模板,这些模板拓展相应的区域模板

使用模板的诀窍:

  • 如果在模板中使用{% exteends %},必须保证其为模板中的第一个模板标记,否则,模板继承将不起作用
  • 一般来说,基本模板中的{% block %}标签越到越好,子模板必须定义父模板中所有的代码块,因此可以用合理的缺省值对一些代码进行填充,然后只对子模板所需的块代码进重定义,
  • 如果发觉有多个模板之间拷贝代码,就应该考虑将该代码放置到父模板的某个{% block %}中
  • 如果需要访问父模板中的块的内容,使用{% block.supeer %} 这个标签,这个魔法变量将会表现出父模板中的内容。如果只想在上级代码块基础上添加内容,而不是全部重载,就使用这个变量
  • 不允许在同一个模板中定义多个同名的{% block %}。存在这样的限制是因为block标签的工作方式是双向的。

Django基础(三)的更多相关文章

  1. day 53-1 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  2. day 67 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  3. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  4. Django基础三之视图函数

    一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错 ...

  5. 03.Django基础三之视图函数

    一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错 ...

  6. Django基础三(form和template)

    上一篇博文学习了Django的View和urls,接下来是对django form 和 template的学习. 1 django form django form为我们提供了便捷的方式来创建一些HT ...

  7. python django基础三 模版渲染

    request对象 当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象.Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 reque ...

  8. Django基础(三)

    知识预览 Ajax前戏:json Ajax简介 jquery实现的ajax JS实现的ajax 回到顶部 Ajax前戏:json 什么是json? 定义: JSON(JavaScript Object ...

  9. 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分

    老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/guobaoyuan/ 开哥blog: https://home.cnblogs.com/u ...

  10. 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分

    老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分   老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...

随机推荐

  1. Python的文件读写与存储

    文件读写与存储 7.2. 读写文件 open()返回一个文件对象,最常见的用法带有两个参数:open(filename, mode). >>> f = open('workfile' ...

  2. Windows 2012 系统汉化

    远程登录服务器 控制面板,选择“语言” (Windows 2012 自带的语言包 ) 此处需要等待 安装完成,选择中文 重启后 应该就不需要做其他的操作了

  3. Windows系统 本地文件如何复制到远程服务器

    很多人在使用远程服务器的时候往往要将本地的文件传输到远程服务器内,方法有很多种,下面介绍下如何使用Windows自带的远程桌面连接程序将文件复制到远程服务器内. 1.首先,点击windows开始按钮, ...

  4. mybaties mapping中if

    mapping中 if的简单使用 <insert id="addPassenger" resultMap="EmpResultMap" parameter ...

  5. Mfc 建立窗口线程

    之前一直都是在学习C,但是没用MFC写过东西.所以这个算是MFC的一个处女作把. 今天硬着头皮写了个爆破工具,但是界面(edit控制)在显示的时候一下就被卡住了. 于是到处问人,后来有个不错的朋友帮我 ...

  6. UOJ14 DZY Loves Graph

    DZY开始有 nn 个点,现在他对这 nn 个点进行了 mm 次操作,对于第 ii 个操作(从 11 开始编号)有可能的三种情况: Add a b: 表示在 aa 与 bb 之间连了一条长度为 ii ...

  7. Redis 创建多个端口

    默认的是6379 可以用6380,6381开启多个 1.开启 ./redis-server ../etc/redis.6380.conf & 2.链接 redis-cli -p 6380 查看 ...

  8. RocketMQ原理讲解系列文章

    [RocketMQ原理解析][http://blog.csdn.net/quhongwei_zhanqiu/article/category/2548637] [消息的可靠性.顺序和重复][https ...

  9. 03-dotnet core创建区域[Areas]及后台搭建

    熟悉MVC的人都知道从MVC4开始引入了区域的机制,区域的创建可以协助你在架构较大的项目中,让独立性较高的部分功能作为一个单独的子MVC系统,降低网站与网站之间的耦合度,也可以通过area切割,让多个 ...

  10. javascript中some,every,map,filter是只用和ansyc中的each,eachLimit,map,mapLImit,filter的使用

    var t = [1,2,3,4,5]; //some找到数组中第一个符合要求的值后就不在继续执行//用来判断数组中是否存符合要求的值,返回结果true|false//function返回类型为boo ...