Django做为一个Web框架,其模板所需的HTML输出静态部分以及动态内容插入javascript
模板由HTML代码和逻辑控制代码构成html
Django框架的模板语言的语法格式:java
{{var_name}}
例如:HTML被直接编码在python代码中:python
import datetime def current_datetie(request): time1 = datetime.datetime.now() html="<html><body>the time is $s.</body></html>"%time1 return HttpResponse(html)
或者:linux
>>> python manange.py shell #进入该django项目的环境 >>> from django.template import Context,Template >>> t1=Template("hello {{name}}.") >>> c1=Context({"name":"world"}) >>> t1.render(c1) 'hello world.'
同一个模板,能够有多个上下文,就能够经过建立模板对象来渲染多个上下文git
建立一个模板就能够屡次调用render()方法渲染上下文正则表达式
语法格式:shell
{{var_name}}
Django模板解析工做都是在后台经过对正则表达式一次性调用来完成django
python manage.py shell #进入Django项目环境终端
>>> from django.template import Template, Context >>> t1 = Template('hello {{ items.2 }}.') >>> c1 = Context({'items': ['linux', 'javascript', 'python']}) >>> t1.render(c1) 'hello python.'
>>> from django.template import Template,Context >>> person = {"name":"Jack","age":22} >>> t1 = Template("{{person.name}} is {{person.age}} years old.") >>> c1 = Context({"person":person}) >>> t1.render(c1) 'Jack is 22 years old.'
>>> from django.template import Template,Context >>> import datetime >>> day1=datetime.datetime.utcnow() >>> day1.year 2017 >>> day1.month 8 >>> day1.day 20 >>> t1=Template("the month is {{ date.month }} and the year is {{ date.year }}") >>> c1=Context({"date":day1}) >>> t1.render(c1) 'the month is 8 and the year is 2017'
>>> class Person(object): ... def __init__(self,first_name,second_name): ... self.first_name=first_name ... self.second_name=second_name ... >>> t1=Template("hello,{{ person.first_name }}--{{ person.second_name }}.") >>> c1=Context({"person":Person("Jack","Bones")}) >>> t1.render(c1) 'hello,Jack--Bones.'
>>> from django.template import Template,Context >>> t1 = Template("{{var}}--{{var.upper}}--{{var.isdigit}}") >>> t1.render(Context({"var":"Hello"})) 'Hello--HELLO--False' >>> t.render(Context({"var":"666"})) '666--666--True'
注意点:安全
调用方法时并无使用圆括号,并且也没法给该方法传递参数
格式:
{{obj|filter:param}}
参数:
add 给变量加上相应的值 addslashes 给变量中的引号前加上斜线 capfirst 首字母大写 cut 从字符串中移除指定的字符 date 格式化日期字符串 default 若是值是False,就替换成设置的默认值,不然就是用原本的值 default_if_none 若是值是None,就替换成设置的默认值,不然就使用原本的值
例子:
#value1="aBcDe" {{ value1|upper }}#输入为"ABCDE" #value2=5 {{ value2|add:3 }}#输入为8 #value3='he llo wo r ld' {{ value3|cut:' ' }}#输入为"helloworld" #value4="hello world" {{ value4|capfirst }}#输入为"Hello world" #import datetime #value5=datetime.datetime.now() {{ value5|date:'Y-m-d' }}#输入为"2017-08-20" #value6=[] {{ value6 }}#输入为"[]" {{ value6|default:'空的' }} #输入为"空的" #value7='<a href="#">click</a>' {{ value7 }}#输入为"<a href="#">click</a>" {{ value7|safe }}<br> # 若是不想标签被渲染,加safe便可 {{ value7|striptags }} {% autoescape off %} #Django安全机制关闭,标签会被渲染 {{ value7 }} {% endautoescape %} #value8='1234' {{ value8|filesizeformat }} {{ value8|first }} {{ value8|length }} {{ value8|slice:":-1" }} #value9='http://www.baidu.com/?a=1&b=3' {{ value9|urlencode }} value9='hello I am Tony'
标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)
{% if %}标签计算一个变量值,若是是“true”,即它存在、不为空而且不是false的boolean值,
系统则会显示{% if %}和{% endif %}间的全部内容
例子:
{% if num >= 100 and 8 %} {% if num > 200 %} <p>num大于200</p> {% else %} <p>num大于100小于200</p> {% endif %} {% elif num < 100%} <p>num小于100</p> {% else %} <p>num等于100</p> {% endif %}
{% if %}标签接受单个and,or或者not来测试多个变量值或者否认一个给定的变量
{% if %}标签不容许同一标签里同时出现and和or,不然会产生歧义
例以下面的标签是不合法的:
{% if obj1 and obj2 or obj3 %}
{% for %}标签按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的全部内容
例子:
<ul> {% for obj in list %} <li>{{ obj }}</li> {% endfor %} </ul>
能够在标签里添加reversed来反序循环列表:
{% for obj in list reversed %} ... {% endfor %}
{% for %}标签能够嵌套:
{% for country in countries %} <h1>{{ country.name }}</h1> <ul> {% for city in country.city_list %} <li>{{ city }}</li> {% endfor %} </ul> {% endfor %}
for循环不支持中断循环,也不支持continue语句
{% for %}标签内置了一个forloop模板变量,这个变量含有关于循环的属性
forloop.counter 表示循环的次数,它从1开始计数 forloop.counter0 相似于forloop.counter,但它是从0开始计数 forloop.revcounter 反向遍历整个列表,revcounter表示循环的次数,最后一次为1 forloop.revcounter0 反向遍历整个列表,revcounter表示循环的次数,最后一次为0 forloop.first 返回一个布尔值,当第一次循环时值为True,其他为False
例子:
{% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %} {% for object in objects %} {% if forloop.first %} <li class="first"> {% else %} <li> {% endif %} {{ object }}</li> {% endfor %}
forloop变量只能在循环中获得,当模板解析器到达{% endfor %}时forloop变量就会消失
若是模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它
Django会在for标签的块中覆盖由开发人员定义的forloop变量的值
在其余非循环的地方,你的forloop变量仍然可用
用法:
{{li }} {% for i in li %} <li>{{ forloop.counter0 }}----{{ i }}</li> {% empty %} <li>this is empty!</li> {% endfor %}
用于生成csrf_token的标签,用于防治跨站攻击验证
若是view的index里用的是render_to_response方法,则不会生效
其实这里是生成一个input标签,与其余表单标签一块儿提交给后台的
用法:
{% verbatim %} #hello标签不会被模板渲染 {{ hello }} {% endverbatim %}
一、在app中建立templatetags模块
二、建立任意 .py 文件,如:my_tags.py
from django import template from django.utils.safestring import mark_safe register = template.Library() # register的名字是固定的,不可改变 @register.filter def custom_filter(x,y): return x*y @register.simple_tag def custom_simple(x,y,z): return x+y+z
三、在使用自定义simple_tag和filter的html文件中导入以前建立的 my_tags.py :{% load my_tags %}
四、使用simple_tag和filter
-------------------------------HTML文件 {% load xxx %} # 位于首行,xxx表明自定义的文件名 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Hello {{ user.0 }}</h1> {{ user.3|custom_filter:8 }} {% custom_simple user.3 2 3 %} </body> </html>
五、在settings中的INSTALLED_APPS配置当前app,否则django没法找到自定义的simple_tag
六、filter能够用在if等语句后,simple_tag不能够
{% if num|filter_multi:30 > 100 %} {{ num|filter_multi:30 }} {% endif %}
{% include %}是一个内建模板标签,容许在模板中包含其它的模板内容.
标签的参数是所要包含的模板的名称,能够是一个变量,也能够是单/双引号硬编码的字符串.
每当在多个模板中出现相同的代码时,就应该考虑是否要使用{% include %}来减小代码重复
在一个大型网站中,有一些区域的内容始终是不变的,
减小共用页面区域所引发的重复和冗余代码Django框架中使用的方法就是模板继承
本质上来讲,模板继承是先构造一个基础框架模板,然后在其子模板中对公用部分和定义块进行重载
母板:{% block title %}{% endblock %} # 定义盒子 子板:{% extends "base.html" %} # 继承母板的内容,且必须放在模板第一行 {% block title %}{% endblock %} # 能够对盒子的内容进行修改 {% csrf_token %} # 取消csrf安全保护 {% black.super %} {% include '小组件路径' %} # HTML出现相同块代码时,新建公用小组件HTML文件
若是在模板中使用{% extends %},必须保证其为模板中的第一个模板标记,不然模板不会起做用
通常来讲,基础模板中的{% block %}标签越多越好,子模板没必要定义父模板中全部的代码块,
所以,能够用合理的缺省值对一些代码块进行填充,而后只对子模板所需的代码块进行重定义.
若是多个模板之间的代码重用太多,能够考虑将重复代码段放放到父模板的某个{% block %}中.
当须要访问父模板中的块的内容,使用{{ block.super }}标签,这个魔法变量将会表现出父模板中的内容,
若是只想在上级代码块基础上添加内容,而不是所有重载,这个魔法变量就很是有用了.
不容许在同一个模板中定义多个同名的{% block %}.
由于block标签的工做方式是双向的,block标签订义了在父模板中{% block %}.
若是父模板中出现了两个相同名称的{% block %}标签,父模板将没法使用哪一个块的内容