Django Template層之Template概述 by:授客 QQ:1033553122 實踐環境 Python版本:python-3.4.0.amd64 下載地址:https://www.python.org/downloads/release/python-340/ Win7 64位 Dj ...
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']})
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