1. 程式人生 > 實用技巧 >Django Template層之Template概述

Django Template層之Template概述

Django Template層之Template概述

by:授客 QQ1033553122

實踐環境

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']})


html模板

<!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)

參考連結:

https://docs.djangoproject.com/en/2.1/topics/templates