模板
作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器。模版致力于表达外观,而不是程序逻辑。模板的设计实现了业务逻辑view与显示内容template的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用。
模板包含两部分:
静态部分,包含html、css、js。
动态部分,就是模板语言。
Django模板语言,简写DTL,定义在django.template包中。 创建项目后,在"项目名称/settings.py"文件中定义了关于模板的配置。
views.py中
from django.shortcuts import render
ef runoob(request):
# 字符串
views_name = "python教程"
# 列表
views_list = ["教程1","教程2","教程3"]
# 字典
views_dict = {"name":"教程"}
views_dict = {"name":"[教程1','教程2','教程3']"}
return render(request,"runood.html", {"name":views_name,"views_list":views_list,"views_dict":views_dict})
runood.html
<p>{{ name }}</p>
<p>{{ views_list }}</p> # 取出整个列表
<p>{{ views_list.0 }}</p> # 取出列表的第一个元素
<p>{{ views_dict }}</p>
<p>{{ views_dict.name }}</p>
过滤器
模板语法:
{{ 变量名 | 过滤器:可选参数 }}
模板过滤器可以在变量被显示前修改它,过滤器使用管道字符
过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:
{{ my_list|first|upper }} 将第一个元素并将其转化为大写。
|safe 可以将乱码转化为字符串进行显示
length
返回对象的长度,适用于字符串和列表。
字典返回的是键值对的数量,集合返回的是去重后的长度。
{{ name|length}}
filesizeformat
以更易读的方式显示文件的大小(即'13 KB', '4.1 MB', '102 bytes'等)。
字典返回的是键值对的数量,集合返回的是去重后的长度
from django.shortcuts import render
def runoob(request):
num=1024
return render(request, "runoob.html", {"num": num})
{{ num|filesizeformat}}
date
根据给定格式对一个日期变量进行格式化。
格式 Y-m-d H:i:s返回 年-月-日 小时:分钟:秒 的格式时间。
**from** django.shortcuts **import** render
**def** runoob(request):
**import** datetime
now =datetime.datetime.now()
**return** render(request, "runoob.html", {"time": now})
{{ time|date:"Y-m-d" }}
模板标签
if/else 标签
基本语法格式如下:
{% if num1 > 20 %}
{{ num1 }}
{% else %}
no
{% endif %}
{% for list0 in list1 %}
{{ list0 }}
{% endfor %}
{% if condition %}
... display
{% endif %}
或者:
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
根据条件判断是否输出。if/else 支持嵌套。
{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:
{% if athlete_list and coach_list %}
athletes 和 coaches 变量都是可用的。
{% endif %}
HelloWorld/HelloWorld/views.py 文件代码:
from django.shortcuts import render
def runoob(request):
views_num = 88
return render(request, "runoob.html", {"num": views_num})
HelloWorld/templates/runoob.html 文件代码:
{%if num > 90 and num <= 100 %}
优秀
{% elif num > 60 and num <= 90 %}
合格
{% else %}
一边玩去~
{% endif %}
再访问访问 http://127.0.0.1:8000/runoob,可以看到页面:
for 标签
{% for %} 允许我们在一个序列上迭代。
与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。
每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。
例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
HelloWorld/HelloWorld/views.py 文件代码:
from django.shortcuts import render
def runoob(request):
views_list = ["教程","教程1","教程2","教程3",]
return render(request, "runoob.html", {"views_list": views_list})
HelloWorld/templates/runoob.html 文件代码:
{% for i in views_list %}
{{ i }}
{% endfor %}
模板继承
模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量。
典型应用:网站的头部、尾部信息。
3.1、父模板
如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。
标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同。父模板中也可以使用上下文中传递过来的数据。
{%block 名称%}
预留区域,可以编写默认内容,也可以没有默认内容
{%endblock 名称%}
3.2、子模板
标签extends:继承,写在子模板文件的第一行。
{% extends "父模板路径"%}
子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。
填充父模板中指定名称的预留区域。
{%block 名称%}
实际填充内容
{{block.super}}用于获取父模板中block的内容
{%endblock 名称%}
实例
view.py
def temp4(request):
"模板继承"
context = {
'title' : '模板继承',
'temp1' : '模板1',
'temp2' : '模板2',
}
return render(request,'temp4.html',context=context)
html:
temp3.html用做父模板,temp4.html做子模板
temp3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>-----------网页头部---------</h1>
<hr>
//
{% block quyu1 %}
<p>这个是区域1 请添加内容{{ title }}</p>
<p>这个是区域1 请添加内容{{ temp1 }}</p>
<p>这个是区域1 请添加内容{{ temp2 }}</p>
{% endblock quyu1 %}
<hr>
{% block quyu2 %}
<p>这个是区域2 请添加内容</p>
{% endblock quyu2 %}
<h1>-------------------网页尾部---------------------</h1>
</body>
</html>
temp4.html
{% extends 'temp3.html' %}
<!-这是继承页面-><!--{-->
<!DOCTYPE html>
<html lang="en">
<head> <meta charset="UTF-8">
<title>Title</title></head>
<body>{% block quyu2%}
<!--添加预留区域的内容--><a>你好呀</a>
{% endblock quyu2 %}
</body></html>