亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

詳解Python的Django框架中的模版繼承

2020-01-04 18:03:31
字體:
供稿:網(wǎng)友

這篇文章主要介紹了詳解Python的Django框架中的模版繼承,就像Python中面對(duì)對(duì)象的方法繼承道理類似,需要的朋友可以參考下

在實(shí)際應(yīng)用中,你將用 Django 模板系統(tǒng)來創(chuàng)建整個(gè) HTML 頁面。 這就帶來一個(gè)常見的 Web 開發(fā)問題: 在整個(gè)網(wǎng)站中,如何減少共用頁面區(qū)域(比如站點(diǎn)導(dǎo)航)所引起的重復(fù)和冗余代碼?

解決該問題的傳統(tǒng)做法是使用 服務(wù)器端的 includes ,你可以在 HTML 頁面中使用該指令將一個(gè)網(wǎng)頁嵌入到另一個(gè)中。 事實(shí)上, Django 通過剛才講述的 {% include %} 支持了這種方法。 但是用 Django 解決此類問題的首選方法是使用更加優(yōu)雅的策略—— 模板繼承 。

本質(zhì)上來說,模板繼承就是先構(gòu)造一個(gè)基礎(chǔ)框架模板,而后在其子模板中對(duì)它所包含站點(diǎn)公用部分和定義塊進(jìn)行重載。

讓我們通過修改 current_datetime.html 文件,為 current_datetime 創(chuàng)建一個(gè)更加完整的模板來體會(huì)一下這種做法:

 

 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 
  4. <title>The current time</title> 
  5. </head> 
  6. <body> 
  7. <h1>My helpful timestamp site</h1> 
  8. <p>It is now {{ current_date }}.</p> 
  9.  
  10. <hr> 
  11. <p>Thanks for visiting my site.</p> 
  12. </body> 
  13. </html> 

這看起來很棒,但如果我們要為第三章的 hours_ahead 視圖創(chuàng)建另一個(gè)模板會(huì)發(fā)生什么事情呢?

 

 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 
  4. <title>Future time</title> 
  5. </head> 
  6. <body> 
  7. <h1>My helpful timestamp site</h1> 
  8. <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p> 
  9.  
  10. <hr> 
  11. <p>Thanks for visiting my site.</p> 
  12. </body> 
  13. </html> 

很明顯,我們剛才重復(fù)了大量的 HTML 代碼。 想象一下,如果有一個(gè)更典型的網(wǎng)站,它有導(dǎo)航條、樣式表,可能還有一些 JavaScript 代碼,事情必將以向每個(gè)模板填充各種冗余的 HTML 而告終。

解決這個(gè)問題的服務(wù)器端 include 方案是找出兩個(gè)模板中的共同部分,將其保存為不同的模板片段,然后在每個(gè)模板中進(jìn)行 include。 也許你會(huì)把模板頭部的一些代碼保存為 header.html 文件:

 

 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 

你可能會(huì)把底部保存到文件 footer.html :

 

 
  1. <hr> 
  2. <p>Thanks for visiting my site.</p> 
  3. </body> 
  4. </html> 

對(duì)基于 include 的策略,頭部和底部的包含很簡單。 麻煩的是中間部分。 在此范例中,每個(gè)頁面都有一個(gè)

My helpful timestamp site

標(biāo)題,但是這個(gè)標(biāo)題不能放在 header.html 中,因?yàn)槊總€(gè)頁面的

包含在頭部,我們就不得不包含

 

Django 的模板繼承系統(tǒng)解決了這些問題。 你可以將其視為服務(wù)器端 include 的逆向思維版本。 你可以對(duì)那些 不同 的代碼段進(jìn)行定義,而不是 共同 代碼段。

第一步是定義 基礎(chǔ)模板 , 該框架之后將由 子模板 所繼承。 以下是我們目前所講述范例的基礎(chǔ)模板:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 
  4. <title>{% block title %}{% endblock %}</title> 
  5. </head> 
  6. <body> 
  7. <h1>My helpful timestamp site</h1> 
  8. {% block content %}{% endblock %} 
  9. {% block footer %} 
  10. <hr> 
  11. <p>Thanks for visiting my site.</p> 
  12. {% endblock %} 
  13. </body> 
  14. </html> 


這個(gè)叫做 base.html 的模板定義了一個(gè)簡單的 HTML 框架文檔,我們將在本站點(diǎn)的所有頁面中使用。 子模板的作用就是重載、添加或保留那些塊的內(nèi)容。 (如果你一直按順序?qū)W習(xí)到這里,保存這個(gè)文件到你的template目錄下,命名為 base.html .)

我們使用一個(gè)以前已經(jīng)見過的模板標(biāo)簽: {% block %} 。 所有的 {% block %} 標(biāo)簽告訴模板引擎,子模板可以重載這些部分。 每個(gè){% block %}標(biāo)簽所要做的是告訴模板引擎,該模板下的這一塊內(nèi)容將有可能被子模板覆蓋。

現(xiàn)在我們已經(jīng)有了一個(gè)基本模板,我們可以修改 current_datetime.html 模板來 使用它:

 

 
  1. {% extends "base.html" %} 
  2.  
  3. {% block title %}The current time{% endblock %} 
  4.  
  5. {% block content %} 
  6. <p>It is now {{ current_date }}.</p> 
  7. {% endblock %} 

再為 hours_ahead 視圖創(chuàng)建一個(gè)模板,看起來是這樣的:

 

 
  1. {% extends "base.html" %} 
  2.  
  3. {% block title %}Future time{% endblock %} 
  4.  
  5. {% block content %} 
  6. <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p> 
  7. {% endblock %} 

看起來很漂亮是不是? 每個(gè)模板只包含對(duì)自己而言 獨(dú)一無二 的代碼。 無需多余的部分。 如果想進(jìn)行站點(diǎn)級(jí)的設(shè)計(jì)修改,僅需修改 base.html ,所有其它模板會(huì)立即反映出所作修改。

以下是其工作方式。 在加載 current_datetime.html 模板時(shí),模板引擎發(fā)現(xiàn)了 {% extends %} 標(biāo)簽, 注意到該模板是一個(gè)子模板。 模板引擎立即裝載其父模板,即本例中的 base.html 。

此時(shí),模板引擎注意到 base.html 中的三個(gè) {% block %} 標(biāo)簽,并用子模板的內(nèi)容替換這些 block 。因此,引擎將會(huì)使用我們在 { block title %} 中定義的標(biāo)題,對(duì) {% block content %} 也是如此。 所以,網(wǎng)頁標(biāo)題一塊將由 {% block title %}替換,同樣地,網(wǎng)頁的內(nèi)容一塊將由 {% block content %}替換。

注意由于子模板并沒有定義 footer 塊,模板系統(tǒng)將使用在父模板中定義的值。 父模板 {% block %} 標(biāo)簽中的內(nèi)容總是被當(dāng)作一條退路。

繼承并不會(huì)影響到模板的上下文。 換句話說,任何處在繼承樹上的模板都可以訪問到你傳到模板中的每一個(gè)模板變量。

你可以根據(jù)需要使用任意多的繼承次數(shù)。 使用繼承的一種常見方式是下面的三層法:

創(chuàng)建 base.html 模板,在其中定義站點(diǎn)的主要外觀感受。 這些都是不常修改甚至從不修改的部分。

為網(wǎng)站的每個(gè)區(qū)域創(chuàng)建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。這些模板對(duì) base.html 進(jìn)行拓展,并包含區(qū)域特定的風(fēng)格與設(shè)計(jì)。

為每種類型的頁面創(chuàng)建獨(dú)立的模板,例如論壇頁面或者圖片庫。 這些模板拓展相應(yīng)的區(qū)域模板。

這個(gè)方法可最大限度地重用代碼,并使得向公共區(qū)域(如區(qū)域級(jí)的導(dǎo)航)添加內(nèi)容成為一件輕松的工作。

以下是使用模板繼承的一些訣竅:

如果在模板中使用 {% extends %} ,必須保證其為模板中的第一個(gè)模板標(biāo)記。 否則,模板繼承將不起作用。

一般來說,基礎(chǔ)模板中的 {% block %} 標(biāo)簽越多越好。 記住,子模板不必定義父模板中所有的代碼塊,因此你可以用合理的缺省值對(duì)一些代碼塊進(jìn)行填充,然后只對(duì)子模板所需的代碼塊進(jìn)行(重)定義。 俗話說,鉤子越多越好。

如果發(fā)覺自己在多個(gè)模板之間拷貝代碼,你應(yīng)該考慮將該代碼段放置到父模板的某個(gè) {% block %} 中。

如果你需要訪問父模板中的塊的內(nèi)容,使用 {{ block.super }}這個(gè)標(biāo)簽吧,這一個(gè)魔法變量將會(huì)表現(xiàn)出父模板中的內(nèi)容。 如果只想在上級(jí)代碼塊基礎(chǔ)上添加內(nèi)容,而不是全部重載,該變量就顯得非常有用了。

不允許在同一個(gè)模板中定義多個(gè)同名的 {% block %} 。 存在這樣的限制是因?yàn)閎lock 標(biāo)簽的工作方式是雙向的。 也就是說,block 標(biāo)簽不僅挖了一個(gè)要填的坑,也定義了在父模板中這個(gè)坑所填充的內(nèi)容。如果模板中出現(xiàn)了兩個(gè)相同名稱的 {% block %} 標(biāo)簽,父模板將無從得知要使用哪個(gè)塊的內(nèi)容。

{% extends %} 對(duì)所傳入模板名稱使用的加載方法和 get_template() 相同。 也就是說,會(huì)將模板名稱被添加到 TEMPLATE_DIRS 設(shè)置之后。

多數(shù)情況下, {% extends %} 的參數(shù)應(yīng)該是字符串,但是如果直到運(yùn)行時(shí)方能確定父模板名,這個(gè)參數(shù)也可以是個(gè)變量。 這使得你能夠?qū)崿F(xiàn)一些很酷的動(dòng)態(tài)功能。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚州一区二区| 精品人妻人人做人人爽| 影音先锋国产资源站| 久久99精品一区二区三区| 欧美国产欧美综合| 日韩中文字幕网址| 软萌小仙自慰喷白浆| 狠狠操在线视频| aaa级精品久久久国产片| 亚洲一级生活片| 中文字幕一区二区三区精品| 78m国产成人精品视频| 国产三级在线观看| 成人网站免费观看| 天天摸天天操天天爽| 欧美亚洲丝袜| 成人在线视频免费| 色综合中文综合网| 日韩不卡免费视频| 国产在线你懂得| 99久久久国产精品免费蜜臀| 中文字幕精品一区久久久久| 成人白浆超碰人人人人| 娇妻被老王脔到高潮失禁视频| xfplay资源站色先锋在线观看| 99日韩精品| 国产精品久久777777毛茸茸| 色涩视频在线观看| 在线影院自拍| 日韩三级免费看| 精品在线播放午夜| 麻豆md0077饥渴少妇| 天天操天天干天天操天天干| 国产精品久久一区二区三区| 欧美男人天堂| 国产伦精品一区二区三区视频黑人| aⅴ在线视频男人的天堂| 欧洲精品久久久| 欧美日韩在线不卡一区| 一区二区三区在线视频播放| 久久久久亚洲av片无码| 日本亚洲欧美成人| 精品乱码一区二区三区四区| 99精品国产99久久久久久福利| 国产91精品久| 精品日韩美女的视频高清| 中文字幕亚洲综合久久五月天色无吗''| 最近2018年中文字幕在线| 国产精品视频一二| 国产在线资源一区| 精品免费国产一区二区三区四区| 国产亚洲综合久久| bdsmchinese医疗折磨| 久久亚洲国产成人| 国产色在线 com| 无码人妻av一区二区三区波多野| 黄色免费网站在线| 日本亚洲欧美| 国产不卡一区二区在线观看| 麻豆精品一区| 久久精品国产v日韩v亚洲| 国产乱妇无码大片在线观看| 67194成人在线观看| 国产一区二区黄| 日本国产在线播放| 偷拍中文亚洲欧美动漫| 国产精品高潮呻吟久久av黑人| 一本久道中文无码字幕av| 欧美熟妇一区二区| 国内精品二区| 免费日韩中文字幕| 久久精品这里只有精品| 亚洲小说欧美另类社区| 天天综合色天天综合色hd| 91九色丨porny丨肉丝| 同性恋视频网站资源| 国产肥臀一区二区福利视频| 99久久婷婷国产综合精品电影| 一级性生活免费视频| 97久久天天综合色天天综合色hd| 91麻豆精品国产91久久久资源速度| 欧美日韩免费做爰视频| 91视频论坛| 一二三区视频在线观看| www.四虎.com| 97精品一区二区| 精品日韩视频| 久久sese| 亚洲综合在线第一页| 欧在线一二三四区| 日韩午夜高潮| 69夜色精品国产69乱| 亚洲成aⅴ人片久久青草影院| 特级西西444www大精品视频| 夜夜爽妓女8888视频免费观看| 亚洲国产欧美一区二区三区同亚洲| 欧美揉bbbbb揉bbbbb| 日韩欧美成人精品| 亚洲深夜福利网站| 福利片免费在线观看| 亚洲精品成人影院| 日韩一区二区不卡| 亚洲精品视频在线| 日本久久网站| 国产成人无码一区二区三区在线| 一区二区三区四区视频免费观看| 俄罗斯女人裸体性做爰| 99久久伊人网影院| 日本一级大毛片a一| 91好吊色国产欧美日韩在线| 男女激情片在线观看| 久久久久免费网站| 国产精品极品在线观看| 奇米网人体黄视频| 成人免费不卡视频| 欧美激情乱人伦一区| 超碰成人免费| 日韩理论电影| а_天堂中文在线| 午夜久久福利影院| www.在线视频| h视频在线免费看| 在线观看av不卡| 在线播放91灌醉迷j高跟美女| 一本久久知道综合久久| 成人欧美一区二区三区视频| 精品人妻一区二区三区日产| 欧美 日韩 国产在线观看| 欧美成人高清手机在线视频| 中文字幕成人一区| 日韩中字在线观看| 亚洲一区二区三区四区中文字幕| 国产美女自拍视频| 亚洲AV无码国产精品午夜字幕| 国产精品久久久久免费a∨大胸| 国偷自产一区二区免费视频| 欧美三级视频在线观看| 九九视频在线播放| 国产精品超碰97尤物18| 大色综合视频网站在线播放| 久久久久久久有限公司| 国产经典中年夫妇盗摄| 亚洲最大福利视频网| 黄色aa久久| 亚洲国产精品成人一区二区| 毛片网站在线看| 欧美日韩在线播放一区二区| 成人网ww555视频免费看| 春色成人在线视频| 色哟哟亚洲精品| 91高清视频在线免费观看| 中文字幕欧美区| 日韩三级电影| 天海翼一区二区三区免费| 日本午夜精品理论片a级app发布| 国产精品av网站| 成人av观看| 日韩制服一区| www.99热这里只有精品| 成人综合视频在线| 欧美日韩色视频| 国产亚洲欧洲| 在线成人www免费观看视频| 国内外成人激情视频| 日韩精品一区二区三区久久| 亚洲图片欧美午夜| 国产视频丨精品|在线观看| 亚洲小少妇裸体bbw| 裸体一区二区三区| 产国精品偷在线| 国产成人在线看| 日本视频在线一区| 精品视频—区二区三区免费| 欧美电影在线观看一区| 欧美国产日产图区| 黄色不卡一区| 国产精品一区二区性色av| 欧美一区二区三区不卡| 亚洲91精品| 黑料吃瓜在线观看| 亚洲国产va精品久久久不卡综合| 亚洲免费电影一区| 久久不射电影网| 亚洲天堂资源在线| 色丁香久综合在线久综合在线观看| 青草全福视在线| 日本猛少妇色xxxxx免费网站| 天天摸夜夜添狠狠添婷婷| 97视频免费在线| 欧美色图一区| 欧美性xxxxxxx| 精品1卡二卡三卡四卡老狼| 亚洲xxxx3d| 在线免费看黄色| 精品国产伦一区二区三| 亚洲国产精品一区二区尤物区| 91精品国产麻豆国产自产在线| 亚洲专区欧美专区| 午夜精品影院在线观看| 九色自拍论坛| 欧美日韩精品区别| 日韩欧美国产一区二区三区| 亚洲石原莉奈一区二区在线观看| 中国xxxx视频播放50| 欧美美女一级片| 精品在线视频一区二区| 麻豆传媒在线免费| 黄色一级视频在线观看| 久久九九有精品国产23| 久草免费在线色站| 国产免费无码一区二区| 欧美调教femdomvk| 亚洲美女综合网| 欧美一区二区三区白人| 黄色国产在线视频| 视频免费1区二区三区| 欧美大片大片在线播放| 国产免费专区| 免费无码毛片一区二三区| 亚洲天堂网一区二区| 久久久99精品免费观看不卡| 在线免费国产视频| 老汉色影院首页| 久久成人综合网| 免费国产一区| 亚洲jjzzjjzz在线观看| 国产成人艳妇aa视频在线| 成人一二三区视频| 免费av一级片| 日本大胆欧美人术艺术动态| 国产视频在线一区二区| 欧美高清性xxxx| 欧美午夜精品久久久久久超碰| 性欧美xxxx大乳国产app| 天天操人人爽| 天天做天天躁天天躁| 日韩大片免费观看| 香港三级韩国三级日本三级| 中文字幕中文字幕在线中高清免费版| 熟妇女人妻丰满少妇中文字幕| 亚洲欧美综合视频| 影音先锋国产在线| 最近中文字幕在线免费观看| 成人毛片在线播放| 日本wwww视频| 日本黄色一级网站| 日韩你懂的电影在线观看| 四虎av在线| 欧美日韩一区二区在线| 国产精品99久久久久久久| 中文字幕免费不卡在线| av在线女优影院| 国产二区视频在线观看| 国产精品久线观看视频| 天天做天天躁天天躁| 欧美一级在线免费观看| 色多多国产成人永久免费网站| 夜夜爽www精品| 久久黄色片网站| 亚洲欧洲激情在线| av资源在线观看免费高清| 亚洲一区av在线播放| 亚洲午夜久久久久久久久电影网| 欧美12一14sex性hd| 日本片在线观看| 亚洲性日韩精品一区二区| 性伦欧美刺激片在线观看| 国产精品视频久久一区| 亚洲欧美激情一区二区三区| 亚洲影院在线播放| 91精品国产色综合久久ai换脸| 国产日韩综合| 国产黄色精品网站| 成人网中文字幕| 在线观看入口黄最新永久免费国产| 男人j桶女人的网站| 欧美另类视频在线观看| yiren22亚洲综合| 亚洲国产精品综合久久久| 美女久久久久久久久久| 国产蜜臀一区二区打屁股调教| 日本高清成人免费播放| 好吊妞无缓冲视频观看| jk破处视频在线| 在线国产一区二区三区| 神马久久资源| 91精品入口| 中文字幕久久一区| 日批免费观看视频| 精品在线手机视频| 国产美女精品视频免费观看| 色偷偷777| 成人动漫一区| 欧美丰满少妇xxxxx高潮对白| 视频成人永久免费视频| www.国产福利| 久久国产精品一区二区三区| 琪琪五月天综合婷婷| 永久免费av片在线观看全网站| 久久精品国产亚洲av高清色欲| 亚洲区国产区| 精品国产乱码久久久久久免费| 性高潮久久久久久| 亚洲人成电影网站色| 日本成人中文字幕在线视频| 欧美午夜宅男影院在线观看| 九九久久精品视频| 欧亚在线中文字幕免费| 欧美日韩色图| 国产在线精品自拍| 日本中文字幕在线2020| 久久久www成人免费毛片麻豆| 精品无码av在线| 国产精品夜夜夜一区二区三区尤| 伊人影院综合网| 国产欧美精品一区二区三区-老狼| 欧美精品中文字幕一区二区| 欧美性猛交xxxx富婆| 成人在线分类| 精品国产乱码久久久久久丨区2区| 亚洲国产国产| 91久久综合亚洲鲁鲁五月天| 777亚洲妇女| 亚洲免费在线视频一区 二区| 亚洲欧美日本日韩| 欧美精品偷拍| 成人网免费看| 成人亚洲欧美|