(4)Django學習——模板標籤定義及語法:for循環,if判斷,頁面跳轉,開啓關閉自動轉義,url攜帶參數傳遞,註釋;模板的繼承及引用!!!

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獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章