1. 程式人生 > >django模板templates詳解(二)

django模板templates詳解(二)

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 值12 %} #如果值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詳解(二)