零基礎(chǔ)入手Django(四):模版標(biāo)簽和模版的繼承引用

今天鹦牛,小叮當(dāng)繼續(xù)為大家分享Django干貨。主要內(nèi)容有:端口占用問題的解決勇吊、常用標(biāo)簽曼追、模版的繼承與引用。

一汉规、端口占用問題的解決

如果我們在運(yùn)行Django服務(wù)時(shí)礼殊,不小心啟動(dòng)了兩次服務(wù),例如點(diǎn)了兩次運(yùn)行针史,那么第二次運(yùn)行就會出現(xiàn)”端口占用的問題“晶伦。(也有可能是端口被其他進(jìn)程所占用)

此時(shí)我們有兩種解決辦法:

(1)在pycharm中關(guān)閉一個(gè)啟動(dòng)的服務(wù)。

在pycharm的側(cè)邊欄點(diǎn)擊“紅叉"即可啄枕。

關(guān)閉后婚陪,重啟服務(wù)即可。

(2)使用xshell在ubuntu服務(wù)器中殺死進(jìn)程

使用命令查看當(dāng)前有哪些進(jìn)程

ps?aux

在xshell中運(yùn)行

根據(jù)虛擬環(huán)境找到與Django相關(guān)的進(jìn)程

使用命令”kill -9?進(jìn)程號“殺死進(jìn)程频祝。例如泌参,殺死進(jìn)程10145

kill?-9?10145

在xhell中執(zhí)行后再次使用ps aux查看,發(fā)現(xiàn)進(jìn)程已被殺死

殺死進(jìn)程后常空,重啟服務(wù)即可及舍。

另一個(gè)值得注意的現(xiàn)象是,在Django中窟绷,一個(gè)對象后加一個(gè)逗號,則會被認(rèn)為是一個(gè)元組咐柜。

例如當(dāng)視圖函數(shù)render后不小心加上一個(gè)逗號后兼蜈,系統(tǒng)便會將其當(dāng)是一個(gè)元組攘残,因?yàn)閞ender返回的是一個(gè)對象。

def static_test(request): ? ?return render(request,'movie/static_test.html'),

在瀏覽器中訪問,便會報(bào)錯(cuò)

二为狸、常用標(biāo)簽

  • 定義

  • 標(biāo)簽在渲染的過程中提供任意的邏輯歼郭。

    這個(gè)定義是刻意模糊的。 例如辐棒,一個(gè)標(biāo)簽可以輸出內(nèi)容病曾,作為控制結(jié)構(gòu),例如“if”語句或“for”循環(huán)從數(shù)據(jù)庫中提取內(nèi)容漾根,甚至可以訪問其他的模板標(biāo)簽泰涂。

    2.語法

    標(biāo)簽語法: 由%}和 {% 來定義的,例如:{%tag%} {%endtag%}

    3.常用標(biāo)簽總結(jié)

     1if/elif/else:可以使用and/or/in/not/==/!=/<=/>=,來進(jìn)行判斷辐怕。
    2ifequal/ifnotequal
    3for...in...:和python中for...in...是一樣的用法逼蒙。
    4forloop.counter:當(dāng)前迭代次數(shù),下標(biāo)從1開始寄疏。1是牢,2,3
    5forloop.counter0:當(dāng)前迭代次數(shù)陕截,下標(biāo)從0形如驳棱。0,1农曲,2
    6forloop.revcounter:跟forloop.counter一樣社搅,下標(biāo)從大到小。3朋蔫,2罚渐,1
    7forloop.revcounter0:跟forloop.counter0一樣,下標(biāo)從大到小驯妄。2荷并,1,0
    8forloop.first:返回bool類型青扔,如果是第一次迭代源织,返回true,否則返回false
    9forloop.last:返回bool類型,如果是最后一次迭代微猖,返回true,否則返回false
    10forloop.parentloop:如果發(fā)生多層for循環(huán)嵌套谈息,那么這個(gè)變量返回的是上一層的for
    11for...in...empty:如果沒有數(shù)據(jù),跳轉(zhuǎn)到empty中凛剥。
    12load:加載第三方標(biāo)簽侠仇。最常用的是{%load?static%}
    13url:返回一個(gè)命名了的URL的絕對路徑。
    14with:緩存變量。
    15autoescape:開啟和關(guān)閉自動(dòng)轉(zhuǎn)義逻炊。

    (1)環(huán)境準(zhǔn)備

    ①在templates文件夾下movie中新建"tag_test.html"文件

    代碼如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>模板標(biāo)簽</title>

    </head>
    <body>

    </body>
    </html>

    ②在movie下的views.py中新建視圖函數(shù)

    def tag_test(request): ? ?return render(request,'movie/tag_test.html')

    ③在movie下的urls.py中配置路由

    path('tag/',views.tag_test),

    (2)if類的標(biāo)簽

    模版定義為

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>模板標(biāo)簽</title>

    </head>
    <body>
    {% if name == 'IT小叮當(dāng)' %}
    這是小叮當(dāng)測試的if模版標(biāo)簽<br>
    {% elif name == "IT老叮當(dāng)" %}
    這是老叮當(dāng)測試的elif模版標(biāo)簽<br>
    {% else %}
    這是其它叮當(dāng)測試的else模版標(biāo)簽<br>
    {% endif %}

    {% ifequal name 'ifequal_test' %}
    這是小叮當(dāng)測試的ifequal模板標(biāo)簽{% endifequal %}

    </body>
    </html>

    ①當(dāng)視圖函數(shù)中沒有name變量時(shí)

    def tag_test(request): ? ?return render(request,'movie/tag_test.html')

    在瀏覽器中查看

    ②當(dāng)視圖函數(shù)中傳入name變量互亮,值為“IT小叮當(dāng)”時(shí)

    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={'name':'IT小叮當(dāng)'})

    在瀏覽器中查看

    ③當(dāng)視圖函數(shù)中傳入name變量,值為“IT老叮當(dāng)”時(shí)

    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={'name':'IT老叮當(dāng)'})

    在瀏覽器中查看

    ④當(dāng)視圖函數(shù)中傳入name變量余素,值為“ifequal”時(shí)

    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={'name':'ifequal_test'})

    在瀏覽器中查看

    可以看到 ifequal的作用等價(jià)于“if ==”,由于傳入的name變量值為‘ifequal_test’既不是“IT小叮當(dāng)”也不是“IT老叮當(dāng)”豹休,所以else模板標(biāo)簽觸發(fā),由于值為“ifequal_test”符合ifequal的條件桨吊,所以ifequal模板標(biāo)簽觸發(fā)威根。

    (3)for類標(biāo)簽

    通過視圖函數(shù)向模板傳入列表參數(shù)

    #定義列表lis=['a','b','c','d','e','f','g']
    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={'list':lis})

    模板定義

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>模板標(biāo)簽</title>

    </head>
    <body>列表為:{{ list }}<br>
    for模板標(biāo)簽測試:<br>
    {% for i in list %}
    <li>{{ i }}</li>
    {% endfor %}
    <br>
    <br>
    forloop類模板標(biāo)簽測試:<br>
    {% for i in list %}
    {% if forloop.first %}
    這是用forloopf.first取到的列表第一個(gè)值:{{ i }}<br>
    {% elif forloop.counter0 == 1 %}
    這是用forloop.counter0取到的二個(gè)值:{{ i }}<br>
    {% elif forloop.counter == 3 %}
    這是用forloop.counter取到的三個(gè)值:{{ i }}<br>
    {% elif forloop.revcounter == 1%}
    這是用forloop.revcounter取到的倒數(shù)第一個(gè)值:{{ i }}<br>
    {% elif forloop.revcounter0 == 1%}
    這是用forloop.revcounter0取到的倒數(shù)第二個(gè)值:{{ i }}<br>
    {% else %}
    這是else取到的值{{ i }}<br>
    {% endif %}
    {% endfor %}

    </body>
    </html>

    瀏覽器中查看

    其中counter0表示取下標(biāo)從0開始,counter表示取下標(biāo)從1開始视乐。revcounter0表示倒序取下標(biāo)從大到小洛搀,末位為0,revcounter表示倒序取下標(biāo)炊林,末位為1

    (4)循環(huán)嵌套常用的模板標(biāo)簽

    對forloop.first姥卢、forloop.last、forloop.parentloop的測試

    ①forloop.parentloop可以用來獲取父層循環(huán)(外層循環(huán))的次數(shù)

    模板定義如下渣聚,使用forloop.parentloop來根據(jù)外層循環(huán)的第二次循環(huán)進(jìn)行元素的拼接独榴。

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>模板標(biāo)簽</title>

    </head>
    <body>
    我是list列表:{{ list }}<br>
    我是tuple元組:{{ tuple }}<br>
    {% for i in list %}
    {% for j in tuple %}
    {% if forloop.parentloop.counter0 == 1 %}
    {{ i }}{{ j }}<br>
    {% else %}
    我是在循環(huán)中的小叮當(dāng)<br>
    {% endif %}
    {% endfor %}
    {% endfor %}

    </body>
    </html>

    視圖函數(shù)

    lis=['a','b','c','d','e','f','g']
    lii=['m','n']
    tu=('x','y','z')
    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={'list':lii,
    'tuple':tu,})

    在瀏覽器中查看

    ②forloop.first和forloop.last

    模板定義

    我是list列表:{{ list }}<br>
    我是tuple元組:{{ tuple }}<br>
    {% for i in list %}
    我是{{ i }} 第一次迭代:{{ forloop.first }} 最后一次迭代:{{ forloop.last}}<br>
    {% endfor %}

    瀏覽器中查看

    ③for in empty

    視圖函數(shù)

    empty_list=[]
    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={
    'empty_list':empty_list})

    模板定義

    我是空列表:{{ empty_list }}<br>
    {% for i in empty_list %}
    列表非空才執(zhí)行我{{ i }}<br>
    {% empty %}
    列表為空時(shí)執(zhí)行我,我是IT小叮當(dāng){% endfor %}

    瀏覽器查看

    (5)url標(biāo)簽

    我們在movie下urls.py中奕枝,為index路徑加入?yún)?shù)<age>棺榔,并起名字為“movie_index”

    path('index/<age>',views.index,name='movie_index'),

    在movie下,對應(yīng)的視圖函數(shù)中隘道,在request后症歇,加入?yún)?shù)age表示接收。

    def index(request,age): ? ?return render(request,'movie/index.html',
    context={'strname':'我是字符串',#傳遞字符串 ? ? ? ? ? ? ? ? ? ? ? ? ? 'hello':hello,#傳遞自定義函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? 'xdd_say':xdd_info.say,#傳遞類方法 ? ? ? ? ? ? ? ? ? ? ? ? ? 'xdd':xdd_info,#傳遞類對象 ? ? ? ? ? ? ? ? ? ? ? ? ? 'list':li,#傳遞列表 ? ? ? ? ? ? ? ? ? ? ? ? ? 'dict':di,#傳遞字典 ? ? ? ? ? ? ? ? ? ? ? ? ? 'test':mytest,
    'xdd666':None,
    'num1':18,
    'num2':2,
    'html':'<h1>THIS IS IN HTML!</h1>',
    'float':3.1415,
    'now':datetime.datetime.now
    } )

    在對應(yīng)?tag_test的視圖函數(shù)中傳入age參數(shù)666

    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={'list':lii,
    'tuple':tu,
    'empty_list':empty_list,
    'age':666})

    定義tag_test模版

    頁面跳轉(zhuǎn),我是路徑方法<a href="/movie/index/18">movie主頁</a><br><br>
    頁面跳轉(zhuǎn)谭梗,我是url標(biāo)簽方法<a href="{% url 'movie_index' age %}">movie主頁</a><br>

    在瀏覽器中查看

    點(diǎn)擊路徑方法

    點(diǎn)擊模板標(biāo)簽方法忘晤,可見url標(biāo)簽,空格加參即可激捏。

    (6)with標(biāo)簽

    我們用with標(biāo)簽可以給變量重命名设塔,變量在with到endwith內(nèi)均有效。

    模板定義

    {% with list as l %}

    {{ l }}






    {% endwith %}

    瀏覽器查看

    (7)autoescape開啟远舅、關(guān)閉自動(dòng)轉(zhuǎn)義

    在視圖函數(shù)中傳入html變量

    def tag_test(request): ? ?return render(request,'movie/tag_test.html',
    context={
    'html':'<h1> THIS IS IN HTML!</h1>' ? ? ? ? ? ? ? ? ? ? ? ? ? })

    模版中定義

    原始:{{ html }} <br>
    過濾器實(shí)現(xiàn)html標(biāo)簽效果:{{ html|safe }}<br>
    模板標(biāo)簽實(shí)現(xiàn)html標(biāo)簽效果:{% autoescape off %}
    {{ html }}

    {% endautoescape %}

    瀏覽器中查看

    小結(jié):

    ①過濾器實(shí)現(xiàn)html標(biāo)簽效果時(shí)闰蛔,只針對某個(gè)特定的變量起作用。

    ②模版標(biāo)簽autoescape實(shí)現(xiàn)html標(biāo)簽效果時(shí)图柏,對其所包含的區(qū)域都起作用序六。

    (8)注釋標(biāo)簽comment

    類似于with,注釋標(biāo)簽{%comment%}到{%endcomment%}之間的內(nèi)容均會被注釋。

    未寫完{%comment%}代碼還是亮的

    寫完后蚤吹,全部變暗例诀,成了注釋語句。

    加上{%endcomment%},作用域之外的代碼重新變亮余佃。

    類似于python代碼中用于注釋的“三引號”暮刃。

    三、模版的繼承與引用

    Django模版引擎中最強(qiáng)大也是最復(fù)雜的部分就是“模版繼承”爆土。 模版繼承可以讓你創(chuàng)建一個(gè)基本的“骨架”模版,它包含站點(diǎn)中的全部元素诸蚕,并且可以定義能夠被子模版覆蓋的 blocks 步势。

    我們以“豆瓣網(wǎng)”為例,簡單說明一下繼承的效果背犯。我們比較“豆瓣電影”和“豆瓣讀書”坏瘩。

    這是豆瓣電影:

    這是豆瓣讀書:

    我們會發(fā)現(xiàn),兩個(gè)網(wǎng)址的首部和尾部竟然是一樣的D骸>蠓!

    這便是模板的繼承和引用的效果了。

    1.模板繼承 extends

    (1)在templates下的movie中新建base.html模板和base_test.html模板。

    base模板代碼如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>base頁面</title>
    </head>
    <body>
    我是頭部小叮當(dāng)6666666666666666<br><br><br><br>
    我是中間小叮當(dāng)<br><br><br><br>
    我是底部小叮當(dāng)9999999999999999</body>
    </html>

    base_test模板代碼如下:

    {% extends 'movie/base.html' %}

    movie下views.py中定義視圖函數(shù)

    def base_test(request): ? ?return render(request,'movie/base_test.html')

    movie下urls.py中配置路由

    path('btest/',views.base_test),

    瀏覽器中查看

    可見base_test模板完全繼承引用了base模板蜕径!

    2.block更改繼承

    當(dāng)我們需要更改繼承的模板祈坠,寫入自己的內(nèi)容時(shí),就需要用到blcok了贯钩。

    1)假設(shè)我們要修改“中間小叮當(dāng)”,先在base模板中用block鎖定相應(yīng)內(nèi)容,并起名為“content”

    代碼為

    {% block content%}
    我是中間小叮當(dāng){% endblock %}

    (2)在base_test模板中引入block和對應(yīng)的名字胧华,在作用域內(nèi)重寫想要更改的內(nèi)容。

    代碼如下:

    {% extends 'movie/base.html' %}
    {% block content %}
    我是base_test中的小叮當(dāng)宙彪!{% endblock %}

    在瀏覽器中查看

    (3)以同樣的方法更改為base_test更換title

    在base模板中用block鎖定相應(yīng)內(nèi)容矩动,并起名為“title”

    在base_test模板中用block中重命名為“base_test頁面”

    瀏覽器中查看

    (4)當(dāng)我們想要重寫內(nèi)容,并且保留原來內(nèi)容時(shí)释漆,以模板變量的形式使用block.super即可

    我們在base_test模板名字為“content”的block中 引用block.super

    {% block content %}
    我是base_test中的小叮當(dāng)悲没! ? ?{{ block.super }}
    {% endblock %}

    在瀏覽器中查看

    3.模板引用 include

    (1)templates下movie中新建include_test模板

    代碼如下

    我是include_test中的小叮當(dāng)。<br>
    <br>
    今天周五了灵汪,你們開不開心

    (2)在base_test中使用include引用

    代碼如下

    {% extends 'movie/base.html' %}
    {% block content %}
    我是base_test中的小叮當(dāng)檀训!<br>
    {{ block.super }}<br><br>
    {% include 'movie/include_test.html' %}
    {% endblock %}
    {% block title %}
    base_test頁面{% endblock %}

    瀏覽器中查看

    小結(jié)

    模板繼承使用extends標(biāo)簽實(shí)現(xiàn)。通過使用block來給子模板開放接口享言。

    1峻凫、extends必須是模板中的第一個(gè)出現(xiàn)的標(biāo)簽。

    2览露、子模板中的所有內(nèi)容荧琼,必須出現(xiàn)在父模板定義好的block中,否則django將不會渲染。

    3命锄、如果出現(xiàn)重復(fù)代碼堰乔,就應(yīng)該考慮使用模板。

    4脐恩、盡可能多的定義block镐侯,方便子模板實(shí)現(xiàn)更細(xì)的需求。

    5驶冒、如果在某個(gè)block中苟翻,要使用父模板的內(nèi)容,使用block.super獲取骗污。

    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
    • 序言:七十年代末崇猫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子需忿,更是在濱河造成了極大的恐慌诅炉,老刑警劉巖,帶你破解...
      沈念sama閱讀 217,277評論 6 503
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋厘,死亡現(xiàn)場離奇詭異涕烧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)擅这,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 92,689評論 3 393
    • 文/潘曉璐 我一進(jìn)店門澈魄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仲翎,你說我怎么就攤上這事痹扇。” “怎么了溯香?”我有些...
      開封第一講書人閱讀 163,624評論 0 353
    • 文/不壞的土叔 我叫張陵鲫构,是天一觀的道長。 經(jīng)常有香客問我玫坛,道長结笨,這世上最難降的妖魔是什么? 我笑而不...
      開封第一講書人閱讀 58,356評論 1 293
    • 正文 為了忘掉前任湿镀,我火速辦了婚禮炕吸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勉痴。我一直安慰自己赫模,他們只是感情好,可當(dāng)我...
      茶點(diǎn)故事閱讀 67,402評論 6 392
    • 文/花漫 我一把揭開白布蒸矛。 她就那樣靜靜地躺著瀑罗,像睡著了一般胸嘴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斩祭,一...
      開封第一講書人閱讀 51,292評論 1 301
    • 那天劣像,我揣著相機(jī)與錄音,去河邊找鬼摧玫。 笑死耳奕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诬像。 我是一名探鬼主播吮铭,決...
      沈念sama閱讀 40,135評論 3 418
    • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颅停!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掠拳,我...
      開封第一講書人閱讀 38,992評論 0 275
    • 序言:老撾萬榮一對情侶失蹤癞揉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溺欧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喊熟,經(jīng)...
      沈念sama閱讀 45,429評論 1 314
    • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點(diǎn)故事閱讀 37,636評論 3 334
    • 正文 我和宋清朗相戀三年姐刁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芥牌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
      茶點(diǎn)故事閱讀 39,785評論 1 348
    • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聂使,死狀恐怖壁拉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柏靶,我是刑警寧澤弃理,帶...
      沈念sama閱讀 35,492評論 5 345
    • 正文 年R本政府宣布,位于F島的核電站屎蜓,受9級特大地震影響痘昌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炬转,卻給世界環(huán)境...
      茶點(diǎn)故事閱讀 41,092評論 3 328
    • 文/蒙蒙 一辆苔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扼劈,春花似錦驻啤、人聲如沸。這莊子的主人今日做“春日...
      開封第一講書人閱讀 31,723評論 0 22
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽谢翎。三九已至,卻和暖如春沐旨,著一層夾襖步出監(jiān)牢的瞬間森逮,已是汗流浹背。 一陣腳步聲響...
      開封第一講書人閱讀 32,858評論 1 269
    • 我被黑心中介騙來泰國打工磁携, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褒侧,地道東北人。 一個(gè)月前我還...
      沈念sama閱讀 47,891評論 2 370
    • 正文 我出身青樓谊迄,卻偏偏與公主長得像闷供,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子统诺,可洞房花燭夜當(dāng)晚...
      茶點(diǎn)故事閱讀 44,713評論 2 354

    推薦閱讀更多精彩內(nèi)容