天天看點

Django模版結構優化和加載靜态檔案header.htmlfooter.htmlmain.htmlheader.htmlmain.html

引入模版

有時候一些代碼是在許多模版中都用到的。如果我們每次都重複的去拷貝代碼那肯定不符合項目的規範。一般我們可以把這些重複性的代碼抽取出來,就類似于Python中的函數一樣,以後想要使用這些代碼的時候,就通過include包含進來。這個标簽就是include。示例代碼如下:

header.html

我是header

footer.html

我是footer

main.html

{% include ‘header.html’ %}

我是main内容

{% include 'footer.html' %} include标簽尋找路徑的方式。也是跟render渲染模闆的函數是一樣的。

預設include标簽包含模版,會自動的使用主模版中的上下文,也即可以自動的使用主模版中的變量。如果想傳入一些其他的參數,那麼可以使用with語句。示例代碼如下:

header.html

使用者名:{{ username }}

main.html

{% include “header.html” with username=‘huangyong’ %}

模闆繼承:

在前端頁面開發中。有些代碼是需要重複使用的。這種情況可以使用include标簽來實作。也可以使用另外一個比較強大的方式來實作,那就是模版繼承。模版繼承類似于Python中的類,在父類中可以先定義好一些變量和方法,然後在子類中實作。模版繼承也可以在父模版中先定義好一些子模版需要用到的代碼,然後子模版直接繼承就可以了。并且因為子模版肯定有自己的不同代碼,是以可以在父模版中定義一個block接口,然後子模版再去實作。以下是父模版的代碼:

{% load static %}
<!DOCTYPE html>
<html >
<head>
    <link rel="stylesheet" href="{% static 'style.css' %}" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  />
    <title>{% block title %}我的站點{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/" target="_blank" rel="external nofollow" >首頁</a></li>
            <li><a href="/blog/" target="_blank" rel="external nofollow" >部落格</a></li>
        </ul>
        {% endblock %}
    </div>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
           

這個模版,我們取名叫做base.html,定義好一個簡單的html骨架,然後定義好兩個block接口,讓子模版來根據具體需求來實作。子模闆然後通過extends标簽來實作,示例代碼如下:

{% extends "base.html" %}

{% block title %}部落格清單{% endblock %}

{% block content %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p>
    {% endfor %}
{% endblock %}
           

需要注意的是:extends标簽必須放在模版的第一行。

子模闆中的代碼必須放在block中,否則将不會被渲染。

如果在某個block中需要使用父模版的内容,那麼可以使用{{block.super}}來繼承。比如上例,{%block title%},如果想要使用父模版的title,那麼可以在子模版的title block中使用{{ block.super }}來實作。

在定義block的時候,除了在block開始的地方定義這個block的名字,還可以在block結束的時候定義名字。比如{% block title %}{% endblock title %}。這在大型模版中顯得尤其有用,能讓你快速的看到block包含在哪裡。

加載靜态檔案

在一個網頁中,不僅僅隻有一個html骨架,還需要css樣式檔案,js執行檔案以及一些圖檔等。是以在DTL中加載靜态檔案是一個必須要解決的問題。在DTL中,使用static标簽來加載靜态檔案。要使用static标簽,首先需要{% load static %}。加載靜态檔案的步驟如下:

首先確定django.contrib.staticfiles已經添加到settings.INSTALLED_APPS中。

確定在settings.py中設定了STATIC_URL。

在已經安裝了的app下建立一個檔案夾叫做static,然後再在這個static檔案夾下建立一個目前app的名字的檔案夾,再把靜态檔案放到這個檔案夾下。

例如你的app叫做book,有一個靜态檔案叫做zhiliao.jpg,那麼路徑為book/static/book/zhiliao.jpg。(為什麼在app下建立一個static檔案夾,還需要在這個static下建立一個同app名字的檔案夾呢?原因是如果直接把靜态檔案放在static檔案夾下,那麼在模版加載靜态檔案的時候就是使用zhiliao.jpg,如果在多個app之間有同名的靜态檔案,這時候可能就會産生混淆。而在static檔案夾下加了一個同名app檔案夾,在模版中加載的時候就是使用app/zhiliao.jpg,這樣就可以避免産生混淆。)

如果有一些靜态檔案是不和任何app挂鈎的。那麼可以在settings.py中添加STATICFILES_DIRS,以後DTL就會在這個清單的路徑中查找靜态檔案。比如可以設定為:

STATICFILES_DIRS = [
     os.path.join(BASE_DIR,"static")
 ]
           

在模版中使用load标簽加載static标簽。比如要加載在項目的static檔案夾下的style.css的檔案。那麼示例代碼如下:

{% load static %}
 <link rel="stylesheet" href="{% static 'style.css' %}" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >
           

如果不想每次在模版中加載靜态檔案都使用load加載static标簽,那麼可以在settings.py中的TEMPLATES/OPTIONS添加’builtins’:[‘django.templatetags.static’],這樣以後在模版中就可以直接使用static标簽,而不用手動的load了。

如果沒有在settings.INSTALLED_APPS中添加django.contrib.staticfiles。那麼我們就需要手動的将請求靜态檔案的url與靜态檔案的路徑進行映射了。示例代碼如下:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 其他的url映射
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)