(9)Django框架學習-Templates進階用法--上


也許,你想要自定義和擴展模板引擎,下面會介紹一些關於如何去擴展模板系統的方法,
了解一下模板系統的工作原理,同時也會介紹Django模板系統中的auto-escapint功能,
這是一種安全機制。

復習一下模板語言的用法

{# 模板tag的用法 #}
{% if done %}
<strong>Over</strong>
{% else %}
<strong>wait</strong>
{% endif %}
{# 模板變量的用法 #}
Now is {{ nowtime }}
在views.py中使用模板的時候:
1. 通過模板名,獲得模板對象
2. 創建context對象,類似字典,用於像模板提供變量實際的值
3. 使用context對象進行模板的渲染,返回的是html網頁的內容

使用RequestContext對上下文內容進行重用

當渲染一個模板的時候,我們通常使用的是django.template.Context的對象,
這里要介紹另外一個它的子類,django.template.RequestContext,
RequestContext提供了一種把不同的context內容中公共的部分提取出來的方法,
讓context的內容重用。
下面來看例子:
1. Context版
from django.template import loader, Context
from django.http import HttpResponse

def view_1(request) :
     # ...
    t = loader.get_template( 'template1.html')
    c = Context({
         'app' : 'My app',
         'user' : request.user,
         'ip_address' : request.META[ 'REMOTE_ADDR'],
         'message' : 'I am view 1.'
    })
     return HttpResponse(t.render(c))

def view_2(request) :
     # ...
    t = loader.get_template( 'template2.html')
    c = Context({
         'app' : 'My app',
         'user' : request.user,
         'ip_address' : request.META[ 'REMOTE_ADDR'],
         'message' : 'I am the second view.'
    })
     return HttpResponse(t.render(c))
可以看到兩個context的內容有些是重復的。比如app, user, ip_address
2. 下面改寫成RequestContext版
from django.template import loader, RequestContext
from django.http import HttpResponse

# 使用context processro去提供一些context內容中公共的部分,也就是返回一個字典而已。
def custom_proc(request) :
     "A context processor that provides 'app', 'user' and 'ip_address'."
     return {
         'app' : 'My app',
         'user' : request.user,
         'ip_address' : request.META[ 'REMOTE_ADDR']
    }

def view_1(request) :
     # ...
    t = loader.get_template( 'template1.html')
     # 創建方式不同,需要提供的參數有三個,request對象,字典類型,processors可選 
    c = RequestContext(request, { 'message' : 'I am view 1.'},
            processors =[custom_proc])
     return HttpResponse(t.render(c))

def view_2(request) :
     # ...
    t = loader.get_template( 'template2.html')
    c = RequestContext(request, { 'message' : 'I am the second view.'},
            processors =[custom_proc])
     return HttpResponse(t.render(c))
可以看到所謂的context processors其實就是一個函數,參數為request,
返回一個字典類型。這就是它所做的所有的事。在這里custom_proc返回的
是包含共同的那三個參數的字典
 
RequestContext構造函數中的第三個參數processors是可選的,可以是
多個custom_proc函數的列表或是元組,在這里我們只傳遞了一個,可以為多個。
 
結合RequestContext使用render_to_response函數直接返回HttpResponse對象
return render_to_response( 'template2.html',
        { 'message' : 'I am the second view.'},
         context_instance =RequestContext(request, processors =[custom_proc]))
以上代碼就可以一步到位。
 
但是又引入了另一個問題,在每次使用render_to_response函數時,都要向
RequestContext指定所需要的context processors,因為這個原因,Django又給
我們提供了全局的processors,它默認是被傳遞給RequestContext對象的,這個設置
對應的是D:\Python27\Lib\site-packages\django\conf\global_setings.py文件
中TEMPLATE_CONTEXT_PROCESSORS屬性,這樣使用RequestContext的時候,就
不需要每次指定processors了。
我現在使用的是Django-1.4,所以路徑是在這里,貌似以前的版本是直接在工程
文件夾下的settings.py文件, 上面都是一些processors函數的字符串表示,下面
介紹一些常用的默認被打開的processors提供的參數:
  • django.contrib.auth.context_processors.auth
user : 當前登入的用戶名
perms :用戶所有的權限
  • django.core.context_processors.debug
debug:是否打開DEBUG模式
sql_queries:{'sql': ..., 'time': ...}形式的字典信息,顯示執行的每一個SQL查詢和
它執行所需的時間。從Django的源碼可以看出要使用這個processors,需要首先打開調
試模式,其次需要是你的IP在INITERNAL_IPS元組中。
 
INITERNAL_IPS是什么東西?
它在之前的global_settings.py文件中,目前是一個空的元組,應該是用來安全認證的設置(猜測)。
  • django.core.context_processors.request
這就是request對象的processors,估計是直接返回request對象。
源代碼和想像的一樣。
 
一些關於自定義全局processors的建議:
1. 確保你的每個processor只對應一小部分的功能需要的數據,這樣才能保證重用性更強,
組合方式更多,不會太重復。
 
2. 一旦定義了全局processor,那么它將對使用RequestContext的所有模板文件可見,
所以需要注意模板變量名字的選擇,一種比較好的作法是全局processor中的變量全部使用大寫。
 
3. 習慣把processors函數放在名為context_processors.py文件中,命名習慣而已。只要你在
TEMPLATE_CONTEXT_PROCESSORS元組中寫對你的路徑就可以。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM