Pycharm開發(fā)Django的模版結(jié)構(gòu)優(yōu)化
模版結(jié)構(gòu)優(yōu)化
引入模版
有時候一些代碼是在許多模版中都用到的。如果我們每次都重復(fù)的去拷貝代碼那肯定不符合項目的規(guī)范。一般我們可以把這些重復(fù)性的代碼抽取出來,就類似于Python中的函數(shù)一樣,以后想要使用這些代碼的時候,就通過include包含進(jìn)來。這個標(biāo)簽就是include。示例代碼如下:
# header.html
<p>我是header</p>
# footer.html
<p>我是footer</p>
# main.html
{% include 'header.html' %}
<p>我是main內(nèi)容</p>
{% include 'footer.html' %}
include標(biāo)簽尋找路徑的方式。也是跟render渲染模板的函數(shù)是一樣的。
默認(rèn)include標(biāo)簽包含模版,會自動的使用主模版中的上下文,也即可以自動的使用主模版中的變量。如果想傳入一些其他的參數(shù),那么可以使用with語句。示例代碼如下:
# header.html
<p>用戶名:{{ username }}</p>
# main.html
{% include "header.html" with username='huangyong' %}
模板繼承:
在前端頁面開發(fā)中。有些代碼是需要重復(fù)使用的。這種情況可以使用include標(biāo)簽來實現(xiàn)。也可以使用另外一個比較強(qiáng)大的方式來實現(xiàn),那就是模版繼承。模版繼承類似于Python中的類,在父類中可以先定義好一些變量和方法,然后在子類中實現(xiàn)。模版繼承也可以在父模版中先定義好一些子模版需要用到的代碼,然后子模版直接繼承就可以了。并且因為子模版肯定有自己的不同代碼,因此可以在父模版中定義一個block接口,然后子模版再去實現(xiàn)。以下是父模版的代碼:
{% load static %}
<!DOCTYPE html>
<html>
<head>
? ? <link rel="stylesheet" href="{% static 'style.css' %}" />
? ? <title>{% block title %}我的站點(diǎn){% endblock %}</title>
</head>
<body>
? ? <div id="sidebar">
? ? ? ? {% block sidebar %}
? ? ? ? <ul>
? ? ? ? ? ? <li><a href="/">首頁</a><P>
? ? ? ? ? ? <li><a href="?og/">博客</a><P>
? ? ? ? </ul>
? ? ? ? {% endblock %}
? ? </div>
? ? <div id="content">
? ? ? ? {% block content %}{% endblock %}
? ? </div>
</body>
<cml>
這個模版,我們?nèi)∶凶鯾ase.html,定義好一個簡單的html骨架,然后定義好兩個block接口,讓子模版來根據(jù)具體需求來實現(xiàn)。子模板然后通過extends標(biāo)簽來實現(xiàn),示例代碼如下:
{% extends "base.html" %}
{% block title %}博客列表{% endblock %}
{% block content %}
? ? {% for entry in blog_entries %}
? ? ? ? <h2>{{ entry.title }}</h2>
? ? ? ? <p>{{ entry.body }}</p>
? ? {% endfor %}
{% endblock %}
需要注意的是:extends標(biāo)簽必須放在模版的第一行。
子模板中的代碼必須放在block中,否則將不會被渲染。
如果在某個block中需要使用父模版的內(nèi)容,那么可以使用{{block.super}}來繼承。比如上例,{%block title%},如果想要使用父模版的title,那么可以在子模版的title block中使用{{ block.super }}來實現(xiàn)。
在定義block的時候,除了在block開始的地方定義這個block的名字,還可以在block結(jié)束的時候定義名字。比如{% block title %}{% endblock title %}。這在大型模版中顯得尤其有用,能讓你快速的看到block包含在哪里。