Django基础之模板语言
模板的组成
HTML代码+模板语法
模板语法的的组成
在使用时会被值替换掉的 变量,和控制模版逻辑的 标签(tag)。
模板语法之变量
在 Django 模板中遍历复杂数据结构的关键是句点字符 .
语法:
{{ value_name }}
views:
def index(request):
import datetime
s="hello"
l=[111,222,333] # 列表
dic={"name":"yuan","age":18} # 字典
date = datetime.date(1993, 5, 2) # 日期对象
class Person(object):
def __init__(self,name):
self.name=name
person_yuan=Person("yuan") # 自定义类对象
person_egon=Person("egon")
person_alex=Person("alex")
person_list=[person_yuan,person_egon,person_alex]
return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})
template:
<h4>{{s}}</h4>
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>类对象列表:{{ person_list.0.name }}</h4>
模板之过滤器
语法:
{{obj|filter__name:param}}
default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
{{ value|default:"nothing" }}
length
返回值的长度。它对字符串和列表都起作用。例如:
{{ value|length }}
如果 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。
filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
{{ value|filesizeformat }}
如果 value 是 123456789,输出将会是 117.7 MB。
date
如果 value=datetime.datetime.now(),value应是一个事件对象
{{ value|date:"Y-m-d" }}
slice
如果 value="hello world"
{{ value|slice:"2:-1" }}
切片后的结果为 "llo world"
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
例如:
{{ value|truncatechars:12 }}
如果value为 The Django Book 结果将输出:The Djang...
striptags
过滤字符串的html标签
{{ link|striptags }}
当link为'<a href="https://www.baidu.com">百度</a>' 结果建输出:百度
upper
将字符串转换为大写
{{ value|upper }}
lower
将字符串转换为小写
{{ value|lower}}
cut
移除字符串中指定的字符
{{ value|cut:" " }}
如果value为 "String with spaces",输出的结果为 "Stringwithspaces".
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:
value="<a href="#">点击</a>"
{{ value|safe}}
escape
对字符串进行转义
{% autoescape off %}
{{ link }}
{{ title|escape }}
{% endautoescape %}
link = '<a href="https://www.baidu.com">百度</a>'
title = '<script>...</script>'
结果:

这里简单介绍一些常用的模板的过滤器,更多详见
模板之标签
标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。
一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。
for标签
遍历每一个元素:
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}
可以利用{% for obj in list reversed %}反向完成循环。
遍历一个字典:
{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
注:循环序号可以通过{{forloop}}显示
forloop.counter 当前循环计数,从1开始 forloop.counter0 当前循环计数,从0开始,标准索引方式 forloop.revcounter 当前循环的倒数计数,从列表的长度开始 forloop.revcounter0 当前循环的倒数计数,从列表的长度减1开始,标准索引方式 forloop.first 布尔值,判断是不是循环的第一个元素 forloop.last 布尔值,判断是不是循环的最后一个元素 forloop.parentloop 用于嵌套循环中,得到parent循环的引用,然后可以使用以上的参数。
for ... empty
for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
cycle
再循环是轮流使用给定的字符串或变量或者字符串和变量的组合的值
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
{% for o in some_list %}
<tr class="{% cycle rowvalue1 rowvalue2 %}">
...
</tr>
{% endfor %}
{% for o in some_list %}
<tr class="{% cycle 'row1' rowvalue2 'row3' %}">
...
</tr>
{% endfor %}
if 标签
{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}
with
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
例如:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token
这个标签用于跨站请求伪造保护
{% csrf_token %}
debug
调用调试信息
filter
将filter标签圈定的内容执行过滤器操作
autoescape
自动转义设置,设置为off时功能和safe过滤器相同。
{% autoescape off %}
{{ link }}
{% endautoescape %}
firstof
输出第一个值不等于Fals的变量
load
加载载标签库
示例:通过模板语言加载静态文件
{% load staticfiles %} # 添加到模板文件最顶部
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'js/bootstrap.min.js' %}"></script>
now
获取当前时间
spaceless
移除空格
url
引用路由配置的地址(name)
urls.py
('^client/([0-9]+)/$', app_views.client, name='app-views-client')
{% url 'app-views-client' client.id %}
verbatim
禁止渲染标签 ,将标签中的内容原样输出
{% verbatim %}
{{if dying}}Still alive.{{/if}}
{% endverbatim %}
更多标签和过滤器的用法请参考官方文档:https://docs.djangoproject.com/en/1.9/ref/templates/builtins/
模板的包含和继承
包含
{% include %}允许在模板中包含其他模板的内容。
include标签的参数可以是:模板名称、变量、字符串。
{% include 'base.html' %}
{% include template_name %}
{% include 'base.html' with Django='Django 1.11.9' %}
示例1:
views.py:
from django.template import Template
def index(request):
link = Template('<a href="https://www.baidu.com">百度</a>')
return render(request, 'index.html', link)
index.html:
{% include link %}
示例2:
base.html:
<h3>欢迎使用{{ Django }}</h3>
index.html:
{% include 'base.html' with Django='Django 1.11.9' %}
继承
更多模板的用法请参考官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#include

浙公网安备 33010602011771号