注意:(这个定义是刻意模糊的。 例如,一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签。)
①music应用下的views.py文件
模拟从数据库中得到的数据:
def test01(request):
li=["第一条数据", "第二条数据", "第三条数据", "第四条数据", "第五条数据", "第六条数据","第七条数据", "第八条数据",]
return render(request,"test02.html",context={
"li":li})
②对应的前端html模板文件test02.html
在此模板中使用模板标签中的for循环
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
p{
width: 100px;
color: aqua;
height: 40px;
line-height: 40px;
background-color: skyblue;
}
</style>
</head>
<body>
{
#如果直接使用模板变量这样是列表形式在前端显示:#}
{
{
li }}
{
#使用模板标签中的for循环遍历之后就可以使用html对其进行排版了:#}
<div>
{
% for foo in li %}
<p>{
{
foo }}</p> {
#foo是循环出来的每一条数据,通过循环对每条数据都进行排版!#}
{
% endfor %}
</div>
</body>
</html>
①music应用下的views.py文件
{
#模拟从前端接收到的用户登录与否的状态信息!#}
def test01(request):
b=True
return render(request,"test02.html",context={
"b":b})
②对应的前端html模板文件test02.html
在此模板中使用模板标签中的for循环
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{
#简单实现注册登录以及登录成功的判断:#}
{
#模拟用户浏览网页时,如果登录的话显示用户名名;如果未登录的话显示注册 登录。#}
{
% if b %}
<div>欢迎小明</div>
{
% elif b == "123" %} {
#只是演示下如何进行多重判断,在此处无实际用处!#}
啊哈
{
% else %}
<div>注册 登录</div>
{
% endif %}
</body>
</html>
①music应用下的urls.py文件(在这里我们可以给相应的url路径取个name属性值,这个值是唯一的!!!)
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [ #子路由
path('test01/',views.test01),
path('sing/',views.sing,{
"name":"小明","age":18},name="bb"),
]
②对应的前端html模板文件test02.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{
#实现本地网页的跳转:#}
{
#第一种方法:#}
{
#第一个例子:跳转到首页#}
<a href="http://127.0.0.1:8888">首页1</a> {
# 如果直接写首页路径,今后万一咱的域名改变了,那么所有跳转的都要跟着一个个改,太麻烦啦! #}
<a href="/">首页2</a> {
# 这种方法就避免了刚刚说的情况! /代表的就是当前的ip地址加端口号:http://127.0.0.1:8888 #}
{
#第二个例子:跳转到带有路径的html界面#}
<a href="http://127.0.0.1:8888/music/sing/">跳转1</a> {
# 这样也可能会出现刚刚说的那种情况 #}
<a href="/music/sing">跳转2</a> {
# 这样不会出现刚刚说的那种情况,但是如果咱对应url的路径进行了改变,也会产生与刚刚类似的情况#}
{
#第二种方法: 不管域名或者路径如何改变,name值不变就不需要改变,简单#}
<a href="{% url 'bb' %}">跳转3</a> {
#通过url的name属性值跳转到对应的页面!#}
</body>
</html>
①music应用下的views.py文件
def test01(request):
html1='拉拉
'
html2='拉拉
'
html3='拉拉
'
html4='拉拉
'
return render(request,"test02.html",context={
"h1":html1,"h2":html2,"h3":html3,"h4":html4})
②对应的前端html模板文件test02.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{
#如果我们使用过滤器的话,那么一次只能识别一个,如果数量非常多的话,工作量就太大了!#}
{
{
h1|safe }}
{
#所以模板标签为我们解决了这个问题,不管需要开启自动转义的有多少个,位置分的有多散,只要将其包裹在下面的两行代码之内,都可开启其的自动转义!#}
{
% autoescape off %}
{
{
h1 }}
{
{
h2 }}
{
{
h3 }}
{
% endautoescape %}
</body>
</html>
(前面通过转换器可以实现借由url进行参数传递;现在模板标签也可以进行参数传递!)
(
网站中有些不同的页面当中有些数据是完全一模一样的;
有些数据是不一样的但是前端的排版格式是一模一样的
)
Django模版引擎中最强大也是最复杂的部分就是模版继承了。 模版继承可以让你创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
a_first.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.top{
height: 200px;
background: darkgoldenrod;
}
.con{
height: 500px;
background: aqua;
}
.but{
height: 150px;
background: sandybrown;
}
</style>
</head>
<body>
<div>
<div class="top">头部</div>
<div class="con">内容一</div>
<div class="but">底部</div>
</div>
</body>
</html>
a_second.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.top{
height: 200px;
background: darkgoldenrod;
}
.con{
height: 500px;
background: aqua;
}
.but{
height: 150px;
background: sandybrown;
}
.con .left{
width: 70%;
float: left;
height: 100%;
background: red;
}
.con .right{
width: 30%;
float: left;
height: 100%;
background: #352fff;
}
</style>
</head>
<body>
<div>
<div class="top">头部</div>
<div class="con">
<div class="left">内容二</div>
<div class="right">广告</div>
</div>
<div class="but">底部</div>
</div>
</body>
</html>
a_third.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.top{
height: 200px;
background: darkgoldenrod;
}
.con{
height: 500px;
background: aqua;
}
.but{
height: 150px;
background: sandybrown;
}
.con .left{
width: 70%;
float: left;
height: 100%;
background: #f338ff;
}
.con .right{
width: 30%;
float: left;
height: 100%;
background: #24ff44;
}
</style>
</head>
<body>
<div>
<div class="top">头部</div>
<div class="con">
<div class="left">内容三</div>
<div class="right">广告</div>
</div>
<div class="but">底部</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.top{
height: 200px;
background: darkgoldenrod;
}
.con{
height: 500px;
background: aqua;
}
.but{
height: 150px;
background: sandybrown;
}
.con .right{
width: 30%;
float: left;
height: 100%;
background: #352fff;
}
</style>
{
% block style %}{
% endblock %} {
#让子模板可以对css样式进行覆写!#}
</head>
<body>
<div>
<div class="top">头部</div>
<div class="con">
{
% block con %}
{
% block left %}
{
% endblock %}
{
% block right %}
<div class="right">广告</div>
{
% endblock %}
{
% endblock %}
</div>
<div class="but">底部</div>
</div>
</body>
</html>
a_first.html文件:
{
% extends 'music/base.html' %}
{
% block con %}
内容一
{
% endblock %}
a_second.html文件:
{
% extends 'music/base.html' %}
{
% block style %}
<style>
.con .left{
width: 70%;
float: left;
height: 100%;
background: red;
}
</style>
{
% endblock %}
{
% block left %}
<div class="left">内容二</div>
{
% endblock %}
a_third.html文件:
{
% extends 'music/base.html' %}
{
% block style %}
<style>
.con .left{
width: 70%;
float: left;
height: 100%;
background: #f338ff;
}
.con .right{
width: 30%;
float: left;
height: 100%;
background: #24ff44;
}
</style>
{
% endblock %}
{
% block left %}
<div class="left">内容三</div>
{
% endblock %}
模板继承使用extends标签实现。通过使用block来给子模板开放接口。
1、extends必须是模板中的第一个出现的标签。
2、子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染。
3、如果出现重复代码,就应该考虑使用模板。
4、尽可能多的定义block,方便子模板实现更细的需求。
5、如果在某个block中,要使用父模板的内容,使用block.super获取。