django模板templates詳解(二)
阿新 • • 發佈:2018-06-16
auth authent conf 轉換 decorator 連接 關系 ons VC
1 總體結構
? Django是MTV結構,即:Model, Template, View
Model:定義數據的存儲格式,並且提供了數據庫訪問的API。
View:定義那些數據被顯示,是業務邏輯處理模塊。
Template:定義數據如何被顯示。
Django工程包含工程的配置、及多個APP,每個APP完成相對獨立的功能。在設計中,要盡量保持每個APP的獨立性,以做到APP是即插即用。
2 各個模塊的交互關系
? Django收到HTTP請求後,依次完成下列處理:
根據URL通過URLConf模塊映射到View函數,將HttpRequest對象作為參數傳入。
在View函數中,獲取HTTP請求的參數,通過Model訪問數據庫,進行業務邏輯運算得到輸出數據。
然後,加載Template,根據輸出數據生成頁面,將HttpResponse對象返回。
3 模板概述
#模板處理過程:
1. 模板加載
2. 模板渲染
#模板包含兩個部分:
3. 原始的html??
4. 模板語法標記的內容(標記語言)
#模板引擎就是把模板語法標記的內容,替換成導?到模板引擎的數據
render(request, 模板名稱,傳遞給模板渲染的字典)
render返回的是HttpResponse對象
render的中間結果就是?個字符串,然後?該字符串創建HttpResponse對象
4 定義模板
(1)變量
語法:{{變量名}} {{ var }}
字典查詢{{‘student‘:students}}
屬性與方法{{stu.sname}}
(2 )標簽
語法: {%tag%} 標簽
格式:if語句
{% if 表達式1 %}
語句1
{% elif表達式2 %}
語句2
{% endif %}
格式:for語句
格式{% for 變量 in 列表 %}
語句1
{% empty %} #當列表為空或不存在時執行語句2
語句2
{% endfor %}
(3)comment 多行註釋
{% comment %}
註釋內容
{% endcomment %} 多行註釋
(4)ifqual/ifnotequal 判斷是否相等
作用 : 判斷是否相等或者不相等
格式 : {% ifequal 值1 值2 %} #如果值1=值2則執行
{% endifequal %}
(5) 其他功能
include
作用 : 加載模板並以標簽內的參數渲染
格式 : {% include ‘模板目錄‘ 參數1 參數2%}
url作用反向解析格式 : {% url ‘namespace:name‘ p1 p2 %}
csrf_token作用: 用於跨站請求偽造保護
格式: {% csrf_token %}
block/extends作用 : 用於模板的繼承
autoescape: 作用用於html的轉義
循環forloop常見的功能:
循環類型 | 說明 |
---|---|
{{ forloop.counter0}} | 表示當前是第?次循環,從0數數 |
{{ forloop.revcounter}} | 表示當前是第?次循環,倒著數數,到1停 |
{{ forloop.revcounter0}} | 表示當前第?次循環,倒著數,到0停 |
{{ forloop.last }} | 布爾值是否是最後?個 布爾值 |
{{ forloop.first }} | 是否是第?個 |
{{ forloop.counter }} | 表示當前是第?次循環,從1數數 |
#例子
data={“values”:range(10)}
{% for value in values %}
{{value}}//forloop.count {{forloop.count}}
{% endfor %}
5 過濾器
1 語法
{{ var過濾器 }}
作用
在變量被顯示前修改它
{{ str | upper}}
2 過濾器可以傳遞參數,參數用引號引起
join
格式
列表|join:‘#‘
{{list|join:‘#‘}} 列表數據以#號連接
3 如果一個變量沒有被提供,或者值為false/空,可以使用默認值
default
格式
{{var|default:‘值‘}}
實例
{{test|default:‘沒有‘}} 沒有默認顯示沒有
4 根據給定格式轉換日期為字符串
date
格式
{{ dateVal|date:‘y-m-d‘ }}
5 HTML轉義
escape
6 加減乘除
{{num|add:10}}
{{num|add:-5}}
{% widthratio num 1 5%}}
計算方法num/1*5
{% widthratio num 2 1%}
計算方法num/2*1
6 反向解析
#urls.py根路由
urlpatterns = [
url(r‘^sunck/‘,include(‘myApp.urls‘,namespace=‘app‘))
]
#myApp urls.py
urlpatterns = [
url(r‘^good/(\d+)/(\d+)/$‘,views.good,name=‘good‘),
]
#index.html
<a href=‘ ‘>
<a href=‘{% url ‘app:good‘ 1 2 %}‘> 第一頁 下第二條
7 模板繼承
1 作用
模板繼承可以減少頁面的重復,父模板base.html
2 block標簽
在父模版中預留區域,子模板去填充
{% block 標簽名 %}
3 子模板填充
{% endblock 標簽名 %}
extends標簽
繼承模板,需要寫在模板文件的第一行
{% extends ‘父模板路徑‘ %}
{% extends ‘myApp/base.html‘ %} 引入父模板路徑
#4 實例 base.html 定義父模板
<div id=‘main‘>
{% block main %}
{% endblock main%}
<hr/>
{% block main2 %}
{% endblock main2 %}
</div>
# main.html 定義子模板
{% entends ‘myApp/base.html‘ %}
{% block mian %}
<h1>sunck is a good man<h1/>
{% endblock main %}
{% block mian2%}
<h1>kaige is a good man<h1/>
{% endblock main %}
8 HTML轉義
HTML轉義
作用將受到的字符串當成HTML代碼渲染
轉義
單個轉義
{{ <h1>sunck is a good man</h1>|safe }}
多個轉義
{% autoescape off %}
{{<h1>sunck is a good man</h1>}}
{% endautoescape %}
9 CSRF驗證
CSRF
跨站請求偽造
防護惡意網站:鏈接,表單,按鈕,利用登錄用戶在瀏覽器中認證從而攻擊服務
防止CSRF
在settings中啟用
表單過驗證 {{crsf_token}}
在view.py中引入
from django.views.decorators.csrf import csrf_exempt
在對應的提交函數中
添加@csrf_exempt
#附中間件模塊
MIDDLEWARE = [
‘django.middleware.security.SecurityMiddleware‘,
‘django.contrib.sessions.middleware.SessionMiddleware‘,
‘django.middleware.common.CommonMiddleware‘,
‘django.middleware.csrf.CsrfViewMiddleware‘,
‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
‘django.contrib.messages.middleware.MessageMiddleware‘,
‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
]
10 靜態資源的訪問
1. ?程下建?static?件夾
2. settings??設置
STATICFILES_DIRS=[os.path.join(BASE_DIR,’static’)]
3. 在模板中可以直接使?{% load static %} <link href=“{%
static 資源位置 %}“>
模板中去訪問靜態資源
4. 加載靜態資源模塊
5. src=“{% static 資源位置 %}”URL配置
r’/index/(?P<page_id>\d+)/(?P<anchor>\w+)’
re.findall(r’/index/(?P<page_id>\d+)/(?P<anchor>\w+)’,’/index/12341234/
asdfSDADH,.14387,./,‘)
處理函數使?固定位置來接收參數
django模板templates詳解(二)