1. 模板系统的介绍

Django作为一个Web框架,其模板所需的HTML输出静态部分以及动态内容插入

模板由HTML代码和逻辑控制代码构成

Django框架的模板语言的语法格式:

  1. {{var_name}}

例如:HTML被直接编码在python代码中:

  1. import datetime
  2. def current_datetie(request):
  3. time1 = datetime.datetime.now()
  4. html="<html><body>the time is $s.</body></html>"%time1
  5. return HttpResponse(html)

或者:

  1. >>> python manange.py shell #进入该django项目的环境
  2. >>> from django.template import Context,Template
  3. >>> t1=Template("hello {{name}}.")
  4. >>> c1=Context({"name":"world"})
  5. >>> t1.render(c1)
  6. 'hello world.'

同一个模板,可以有多个上下文,就可以通过创建模板对象来渲染多个上下文

创建一个模板就可以多次调用render()方法渲染上下文

2 模板支持的语法

语法格式:

  1. {{var_name}}

Django模板解析工作都是在后台通过对正则表达式一次性调用来完成

2.1 深度的变量查找

  1. python manage.py shell #进入Django项目环境终端

2.1.1 访问列表索引

  1. >>> from django.template import Template, Context
  2. >>> t1 = Template('hello {{ items.2 }}.')
  3. >>> c1 = Context({'items': ['linux', 'javascript', 'python']})
  4. >>> t1.render(c1)
  5. 'hello python.'

2.1.2 访问字典索引

  1. >>> from django.template import Template,Context
  2. >>> person = {"name":"Jack","age":22}
  3. >>> t1 = Template("{{person.name}} is {{person.age}} years old.")
  4. >>> c1 = Context({"person":person})
  5. >>> t1.render(c1)
  6. 'Jack is 22 years old.'

2.1.3 datetime示例

  1. >>> from django.template import Template,Context
  2. >>> import datetime
  3. >>> day1=datetime.datetime.utcnow()
  4. >>> day1.year
  5. 2017
  6. >>> day1.month
  7. 8
  8. >>> day1.day
  9. 20
  10. >>> t1=Template("the month is {{ date.month }} and the year is {{ date.year }}")
  11. >>> c1=Context({"date":day1})
  12. >>> t1.render(c1)
  13. 'the month is 8 and the year is 2017'

2.1.4 类的实例

  1. >>> class Person(object):
  2. ... def __init__(self,first_name,second_name):
  3. ... self.first_name=first_name
  4. ... self.second_name=second_name
  5. ...
  6. >>> t1=Template("hello,{{ person.first_name }}--{{ person.second_name }}.")
  7. >>> c1=Context({"person":Person("Jack","Bones")})
  8. >>> t1.render(c1)
  9. 'hello,Jack--Bones.'

2.1.5 引用对象方法

  1. >>> from django.template import Template,Context
  2. >>> t1 = Template("{{var}}--{{var.upper}}--{{var.isdigit}}")
  3. >>> t1.render(Context({"var":"Hello"}))
  4. 'Hello--HELLO--False'
  5. >>> t.render(Context({"var":"666"}))
  6. '666--666--True'

注意点:

  1. 调用方法时并没有使用圆括号,而且也无法给该方法传递参数

2.2 变量的过滤器(filter的使用)

格式:

  1. {{obj|filter:param}}

参数:

  1. add 给变量加上相应的值
  2. addslashes 给变量中的引号前加上斜线
  3. capfirst 首字母大写
  4. cut 从字符串中移除指定的字符
  5. date 格式化日期字符串
  6. default 如果值是False,就替换成设置的默认值,否则就是用本来的值
  7. default_if_none 如果值是None,就替换成设置的默认值,否则就使用本来的值

例子:

  1. #value1="aBcDe"
  2. {{ value1|upper }}#输入为"ABCDE"
  3. #value2=5
  4. {{ value2|add:3 }}#输入为8
  5. #value3='he llo wo r ld'
  6. {{ value3|cut:' ' }}#输入为"helloworld"
  7. #value4="hello world"
  8. {{ value4|capfirst }}#输入为"Hello world"
  9. #import datetime
  10. #value5=datetime.datetime.now()
  11. {{ value5|date:'Y-m-d' }}#输入为"2017-08-20"
  12. #value6=[]
  13. {{ value6 }}#输入为"[]"
  14. {{ value6|default:'空的' }} #输入为"空的"
  15. #value7='<a href="#">click</a>'
  16. {{ value7 }}#输入为"<a href="#">click</a>"
  17. {{ value7|safe }}<br> # 如果不想标签被渲染,加safe即可
  18. {{ value7|striptags }}
  19. {% autoescape off %} #Django安全机制关闭,标签会被渲染
  20. {{ value7 }}
  21. {% endautoescape %}
  22. #value8='1234'
  23. {{ value8|filesizeformat }}
  24. {{ value8|first }}
  25. {{ value8|length }}
  26. {{ value8|slice:":-1" }}
  27. #value9='http://www.baidu.com/?a=1&b=3'
  28. {{ value9|urlencode }}
  29. value9='hello I am Tony'

标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)

2.3 模板语言的控制语句

2.3.1 {% if %} 的使用

{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是falseboolean值,

系统则会显示{% if %}{% endif %}间的所有内容

例子:

  1. {% if num >= 100 and 8 %}
  2. {% if num > 200 %}
  3. <p>num大于200</p>
  4. {% else %}
  5. <p>num大于100小于200</p>
  6. {% endif %}
  7. {% elif num < 100%}
  8. <p>num小于100</p>
  9. {% else %}
  10. <p>num等于100</p>
  11. {% endif %}

{% if %}标签接受单个andor或者not来测试多个变量值或者否定一个给定的变量

{% if %}标签不允许同一标签里同时出现andor,否则会产生歧义

例如下面的标签是不合法的:

  1. {% if obj1 and obj2 or obj3 %}

2.3.2 {% for %}的使用

{% for %}标签按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}{% endfor %}之间的所有内容

例子:

  1. <ul>
  2. {% for obj in list %}
  3. <li>{{ obj }}</li>
  4. {% endfor %}
  5. </ul>

可以在标签里添加reversed来反序循环列表:

  1. {% for obj in list reversed %}
  2. ...
  3. {% endfor %}

{% for %}标签可以嵌套:

  1. {% for country in countries %}
  2. <h1>{{ country.name }}</h1>
  3. <ul>
  4. {% for city in country.city_list %}
  5. <li>{{ city }}</li>
  6. {% endfor %}
  7. </ul>
  8. {% endfor %}

for循环不支持中断循环,也不支持continue语句

{% for %}标签内置了一个forloop模板变量,这个变量含有关于循环的属性

  1. forloop.counter 表示循环的次数,它从1开始计数
  2. forloop.counter0 类似于forloop.counter,但它是从0开始计数
  3. forloop.revcounter 反向遍历整个列表,revcounter表示循环的次数,最后一次为1
  4. forloop.revcounter0 反向遍历整个列表,revcounter表示循环的次数,最后一次为0
  5. forloop.first 返回一个布尔值,当第一次循环时值为True,其余为False

例子:

  1. {% for item in todo_list %}
  2. <p>{{ forloop.counter }}: {{ item }}</p>
  3. {% endfor %}
  4. {% for object in objects %}
  5. {% if forloop.first %}
  6. <li class="first">
  7. {% else %}
  8. <li>
  9. {% endif %}
  10. {{ object }}</li>
  11. {% endfor %}

forloop变量只能在循环中得到,当模板解析器到达{% endfor %}forloop变量就会消失

如果模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它

Django会在for标签的块中覆盖由开发人员定义的forloop变量的值

在其他非循环的地方,你的forloop变量仍然可用

2.3.3 {% empty %}

用法:

  1. {{li }}
  2. {% for i in li %}
  3. <li>{{ forloop.counter0 }}----{{ i }}</li>
  4. {% empty %}
  5. <li>this is empty!</li>
  6. {% endfor %}

2.3.4 {% csrf_token %} csrf_token标签

用于生成csrf_token的标签,用于防治跨站攻击验证

如果viewindex里用的是render_to_response方法,则不会生效

其实这里是生成一个input标签,与其他表单标签一起提交给后台的

2.3.5 {% url %} #引用路由配置的地址

2.3.6 {% verbatim %} #禁止render

用法:

  1. {% verbatim %} #hello标签不会被模板渲染
  2. {{ hello }}
  3. {% endverbatim %}

2.3.7 {% load %} 加载标签库

2.3.8 自定义filter和simply_tag

1、在app中创建templatetags模块

2、创建任意 .py 文件,如:my_tags.py

  1. from django import template
  2. from django.utils.safestring import mark_safe
  3. register = template.Library() # register的名字是固定的,不可改变
  4. @register.filter
  5. def custom_filter(x,y):
  6. return x*y
  7. @register.simple_tag
  8. def custom_simple(x,y,z):
  9. return x+y+z

3、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

4、使用simple_tag和filter

  1. -------------------------------HTML文件
  2. {% load xxx %} # 位于首行,xxx代表自定义的文件名
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Title</title>
  8. </head>
  9. <body>
  10. <h1>Hello {{ user.0 }}</h1>
  11. {{ user.3|custom_filter:8 }}
  12. {% custom_simple user.3 2 3 %}
  13. </body>
  14. </html>

5、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag

6、filter可以用在if等语句后,simple_tag不可以

  1. {% if num|filter_multi:30 > 100 %}
  2. {{ num|filter_multi:30 }}
  3. {% endif %}

2.4 模板继承

2.4.1 include(继承)模板标签

{% include %}是一个内建模板标签,允许在模板中包含其它的模板内容.

标签的参数是所要包含的模板的名称,可以是一个变量,也可以是单/双引号硬编码的字符串.

每当在多个模板中出现相同的代码时,就应该考虑是否要使用{% include %}来减少代码重复

2.4.2 extend(继承)模板标签

在一个大型网站中,有一些区域的内容始终是不变的,

减少共用页面区域所引起的重复和冗余代码Django框架中使用的方法就是模板继承

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

  1. 母板:{% block title %}{% endblock %} # 定义盒子
  2. 子板:{% extends "base.html" %} # 继承母板的内容,且必须放在模板第一行
  3.    {% block title %}{% endblock %} # 可以对盒子的内容进行修改
  4. {% csrf_token %} # 取消csrf安全保护
  5.    {% black.super %}
  6. {% include '小组件路径' %} # HTML出现相同块代码时,新建公用小组件HTML文件

如果在模板中使用{% extends %},必须保证其为模板中的第一个模板标记,否则模板不会起作用

一般来说,基础模板中的{% block %}标签越多越好,子模板不必定义父模板中所有的代码块,

因此,可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行重定义.

如果多个模板之间的代码重用太多,可以考虑将重复代码段放放到父模板的某个{% block %}中.

当需要访问父模板中的块的内容,使用{{ block.super }}标签,这个魔法变量将会表现出父模板中的内容,

如果只想在上级代码块基础上添加内容,而不是全部重载,这个魔法变量就非常有用了.

不允许在同一个模板中定义多个同名的{% block %}.

因为block标签的工作方式是双向的,block标签定义了在父模板中{% block %}.

如果父模板中出现了两个相同名称的{% block %}标签,父模板将无法使用哪个块的内容

Django中模板的用法简介的更多相关文章

  1. Django中的路由配置简介

    Django中的路由配置简介 路由配置(URLconf)就是Django所支撑网站的目录.其实,我们利用路由交换中的"寻址"的概念去理解Django的路由控制会简单很多,它的本质就 ...

  2. django 中模板语言的各种用法

    模板 1.视图中使用模板 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户 1.普通方法:HTML被直接硬编码在 P ...

  3. django中模板变量与内置标签以及过滤器

    本文参考 官方文档 . 一  模板变量 格式: {{ variable_name }} variable_name   命名规则与变量命名规则类似,允许字符数字下划线,不允许标点. variable_ ...

  4. Django中模板使用

    第一步:配置 1.在工程中创建模板目录templates. 2.在settings.py配置文件中修改TEMPLATES配置项的DIRS值:TEMPLATES = [ { 'BACKEND': 'dj ...

  5. django中模板

    一.创建模板目录和模板html文件 # /templates/应用名称/html文件集合 #模板目录:创建项目根目录下面,和manage.py工具在同一层#在模板目录下面分别创建各个应用的模板目录#最 ...

  6. django中tag的用法

    在app里建一个子的python包,包含__init__.py,包名为templatetags,里面新建一个tags.py(这个名字可以随意) from django import templater ...

  7. Django 中form的用法

    form的主要作用:1.在html中生成表单框架,2.验证数据(实话实说,很简洁,但不实用,灵活性差) from django.db import models # Create your model ...

  8. django中're_path'的用法

    1.re_path和path的作用是一样的.只不过're_path'是在写url的时候可以用正则表达式,功能更加强大.2.写正则表达式都推荐使用原生字符串.也就是以‘r’开头的字符串:r'move/' ...

  9. django中request相关用法

    URL相关信息: HttpRquest对象包含当前请求url的一些信息,通过这些信息,你可以获得正在访问这个页面的用户,或者使用的浏览器: request.path :除域名以外的请求路径,以正斜杠开 ...

随机推荐

  1. HDU1754-I Hate It-线段树

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. Number Sequence(快速幂矩阵)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 Number Sequence Time Limit: 2000/1000 MS (Java/O ...

  3. (a == 1 && a == 2 && a == 3),何时为true?

    今天浏览一些技术网站,看到这个题目.虽然觉着代码这么写的可能性低之又低,但是却也考验对js了解的程度. 在 JavaScript 中 (a ==1 && a== 2 && ...

  4. Spring学习日志之Spring MVC启动配置

    对DispatcherServlet进行配置 Spring MVC的配置实际上就是对DispatcherServlet的配置 public class DispatcherServletConfig ...

  5. c#中winform窗口的隐藏与显示

    最近在做一个C# 的winform客户端程序,要实现在打开新的窗口时将原来打开的窗口关闭,但是想在关闭新打开的窗口是将原来的那个窗口再次打开,在网上查找各种资料,找了很多代码,都是通过窗口.Hide( ...

  6. 独立成分分析(ICA)的模拟实验(R语言)

    本笔记是ESL14.7节图14.42的模拟过程.第一部分将以ProDenICA法为例试图介绍ICA的整个计算过程:第二部分将比较ProDenICA.FastICA以及KernelICA这种方法,试图重 ...

  7. Fiddler显示服务器IP的方法

    Fiddler默认配置中是看不到服务器IP的,接下来简单介绍下在fiddler上也能够看到请求的服务器IP: 1.Fiddler--->Rules--->Customize Rules , ...

  8. WebService短信网关配置

    第一步:WebService框架选择[以CXF为例] 1.下载地址:http://cxf.apache.org/download.html,请事先安装好JDK(本人使用的是apache-cxf-2.7 ...

  9. Laravel5.5 的 Homestead 开发环境部署

    首先明白以下几个概念 VirtualBox  -- Oracle 公司的虚拟机软件, 能运行在当前大部分流行的系统上; Vagrant 提供一种命令行接口, 允许自动化安装虚拟机, 并且因为是脚本编写 ...

  10. ftp上传文件,本地安装了,服务器上也需要在也安装一个ftp

    服务器需要配置FTP服务: 你说的在你自己电脑上安装的只是一个FTP软件,用于连接远程服务器进行上传和下载文件的. 追问 在本地已经安装了,链接的话要在服务器上也安装一个吗? 追答 额,你有FTP服务 ...