1.常用標籤
(1)模板標籤重要概念:
1.定義:標籤在渲染的過程中提供任意的邏輯
注意:(這個定義是刻意模糊的。 例如,一個標籤可以輸出內容,作爲控制結構,例如“if”語句或“for”循環從數據庫中提取內容,甚至可以訪問其他的模板標籤。)
2.標籤語法: 由 {% 和 %} 來定義的,例如:{%tag%} {%endtag%}
(2)常用模板標籤講解及使用:
1.模板標籤中的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>
③前端實現:
2.模板標籤中的if判斷:
①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>
③前端實現:
3.模板標籤中的頁面跳轉:
①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>
4.模板標籤中的開啓和關閉自動轉義(是否讓html標籤在前端中生效!):
①music應用下的views.py文件
def test01(request):
html1='<h1>拉拉</h1>'
html2='<h1>拉拉</h1>'
html3='<h1>拉拉</h1>'
html4='<h1>拉拉</h1>'
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>
4.模板標籤中的url攜帶參數傳遞
(前面通過轉換器可以實現藉由url進行參數傳遞;現在模板標籤也可以進行參數傳遞!)
5.模板標籤中的註釋:
2.模板的繼承與引用
(
網站中有些不同的頁面當中有些數據是完全一模一樣的;
有些數據是不一樣的但是前端的排版格式是一模一樣的
)
Django模版引擎中最強大也是最複雜的部分就是模版繼承了。 模版繼承可以讓你創建一個基本的“骨架”模版,它包含您站點中的全部元素,並且可以定義能夠被子模版覆蓋的 blocks 。
(1)首先,看一個例子:(同一個站點下有三個html模板,樣式如下!!!)
①第一個html模板:
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>
前端實現:
②第二個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>
前端實現:
③第三個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>
前端實現:
(2)不難看出,這三個前端界面頭部和底部是一模一樣的;後兩個的中間內容部分右側也都是廣告頁面。而我們爲了實現這三個html界面分別碼了那麼多重複的代碼,費時費力,考慮到類可以繼承,那麼咱的html模板能否繼承呢?答案是肯定的,下面咱們來使用模板的繼承看一看可以給咱節省多少精力:
①編寫父級模板base.html:(編寫父級模板原則:相同的部分直接編寫代碼,使子模板直接繼承[模板繼承使用extends標籤實現];不同的部分通過使用block來給子模板開放接口,使子模板可以進行覆寫[模板覆寫使用block標籤實現])
<!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>
②第一個html模板:
a_first.html文件:
{% extends 'music/base.html' %}
{% block con %}
內容一
{% endblock %}
②第二個html模板:
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 %}
②第三個html模板:
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 %}
(3)經過Django實現會發現跟上面不使用模板繼承效果一模一樣!!!而且咱的代碼簡潔太多 。來總結一下模板的繼承及引用:
模板繼承使用extends標籤實現。通過使用block來給子模板開放接口。
1、extends必須是模板中的第一個出現的標籤。
2、子模板中的所有內容,必須出現在父模板定義好的block中,否則django將不會渲染。
3、如果出現重複代碼,就應該考慮使用模板。
4、儘可能多的定義block,方便子模板實現更細的需求。
5、如果在某個block中,要使用父模板的內容,使用block.super獲取。