天天看點

Django Template層之Template概述

Django Template層之Template概述

by:授客 QQ:1033553122

實踐環境

Python版本:python-3.4.0.amd64

下載下傳位址:https://www.python.org/downloads/release/python-340/

Win7 64位

Django  1.11.4

下載下傳位址:https://www.djangoproject.com/download/

模闆引擎支援

配置

通過settings.py中的TEMPLATES 配置模闆引擎。TEMPLATES配置為一個list清單,每個清單代表一個引擎,預設值為空list。以下為自動生成的配置:

TEMPLATES = [

    {

        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        'DIRS': [],

        'APP_DIRS': True,

        'OPTIONS': {

            # ... some options here ...

        },

    },

]

說明:

BACKEND 點分python path,指定django模闆backend api的模闆引擎類。内置的backend引擎為django.template.backends.django.DjangoTemplates 和 django.template.backends.jinja2.jinja2

DIRS 定義引擎查找模闆源檔案的目錄

APP_DIRS 告訴引擎是在已安裝應用内部查找模闆,每個backend在應用内部,按約定名稱定義了用于存儲模闆一個目錄。

OPTIONS 包含backend具體的配置

用法(Usage)

Built-in backends

Custom backends

Debug integration for custom engines

Django模闆語言

變量(Variables)

變量輸出來自context的值,context-類似字典的對象

變量采用{{ }} 包圍,例子:

html模闆

<!DOCTYPE html>      
<html lang="zh-cn">      
<head>      
    {% load staticfiles %}      
</head>      
<body>      
<div>      
My first name is {{ first_name }}. My last name is {{ last_name }}.      
</div>      
</body>      
</html>      

視圖

#-*- encoding:utf-8 -*-      
__author__ = 'shouke'      
from django.shortcuts import render      
# Create your views here.      
def test_page(request):      
    return render(request, 'website/pages/mytest.html',{'first_name': 'John', 'last_name': 'Doe'})      

渲染結果為

支援字典查找,對象屬性查找,list索引查找:

{{ my_dict.key }}

{{ my_object.attribute }}

{{ my_list.0 }}

例子:上述render函數代碼如果修改為以下

return render(request, 'website/pages/mytest.html',{'name':{'first_name': 'John', 'last_name': 'Doe'}})      
則可在html模闆中這樣引用 {{ name.first_name }}      

如果變量解析為一個可調用對象,那麼模闆系統将不帶參數調用該可調用對象,并使用其返還結果。

标簽(Tags)

标簽用于在渲染過程中提供靈活的邏輯處理(arbitrary logic)      
标簽應該使用 {% %} 包圍,形如      
{% csrf_token %}      

大部分标簽都可以接收參數

{% cycle 'odd' 'even' %}

引用urls.py中的指定url

{% url app_name:url_name%}

一些tag要求有開始标簽和結束标簽

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}

一些例子:

例1:根據使用者是否登入展示不同的内容      
{% if user.is_authenticated %}      
<p>你已登入,歡迎你:<a href="#">{{ user.username }}</a></p>      
{% else %}      
<p>你還沒有登入,請      
    <button><a href="#">登入</a></button>      
    或者      
    <button><a href="#">注冊</a></button>      
</p>      
{% endif %}      

{% if athlete_list %}

    Number of athletes: {{ athlete_list|length }}

{% elif athlete_in_locker_room_list %}

    Athletes should be out of the locker room soon!

{% else %}

    No athletes.

{% endif %}

<ul>

{% for athlete in athlete_list %}

    <li>{{ athlete.name }}</li>

{% endfor %}

</ul>

例2:基于名稱空間和url命名,在html模闆中引用urls.py中的指定url

app應用的urls.py配置如下

__author__ = 'shouke'

from django.conf.urls import url

from . import views

from . import register_views

from . import login_out_views

from . import change_pwd_views

app_name = 'website'

urlpatterns = [

……,

    url(r' ^platform/ pages/home.html$'', views.home, name='home_url'),

<li class="active" id="defaultMenu"><a href="{% url 'website:home_url' %}">首頁</a></li>

程式運作時,這裡的

<a href="{% url 'website:home_url' %}

将被替換為

<a href="/platform/ pages/home.html"}

參考連結:https://docs.djangoproject.com/en/2.1/ref/templates/language/#tags

for循環周遊list

view視圖

#-*- encoding:utf-8 -*-


__author__ = 'shouke'

from django.shortcuts import render

# Create your views here.


def test_page(request):

    return render(request, 'website/pages/mytest.html',{'result':['html', 'js', 'csss']})

      
<!DOCTYPE html>

<html lang="zh-cn">

<head>

    {% load staticfiles %}


</head>

<body>

{% for value in result %}

        <p>{{ value }}</p>

{% endfor %}



</body>

</html>      

運作結果:

在html模闆中使用引用會話資訊

{% for key,value in request.session.items %}      
    {% ifequal 'username' key %}      
        username is {{ value }}      
    {% endifequal %}      
{% endfor %}      

過濾器(Filters)

注釋(Comments)

單行注釋

html模闆中使用單行注釋,形如以下:

{# this won't be rendered #}

多行注釋

使用 comment tag實作多行注釋

<body>

{% comment %}

<div>

My first name is {{ first_name }}. My last name is {{ last_name }}.

</div>

{% endcomment %}

</body>

>>> all_entries = Person.objects.all()

>>> all_entries

<QuerySet [<Person: Person object>]>

all()方法會傳回資料庫表中所有記錄的結果集,等同于以下sql SELECT 語句

SELECT * FROM `myapp_person`

元件(Commponents)