posts - 431,  comments - 344,  trackbacks - 0

          原文地址:http://jjz.javaeye.com/blog/282805
          默認(rèn)情況下,模板是不能訪問request的。要在模板里使用request,其實(shí)很簡單。
          首先,在視圖里,我們不能再使用默認(rèn)的Context(django.template.Context),而是要使用它的子類RequestContext (django.template.RequestContext),這個類很好很強(qiáng)大,一會你就知道了!
          RequestContext的第一個參數(shù)是HttpRequest對象,在視圖中我們直接使用request就行。
          把以前的Python代碼
          c = Context(request, dict)  
          改成Python代碼
          c = RequestContext(request, dict)  
          dict是你想傳遞給模板的字典。
          如果以前使用的是人見人愛的render_to_response
          Python代碼
          return render_to_response('template.html', {...})  
          改成
          Python代碼
          return render_to_response('template.html', {...}, context_instance=RequestContext(request))  
          也就是增加一個context_instance參數(shù)。

          光這樣還不行。在配置文件(一般是setting.py)中,找到TEMPLATE_CONTEXT_PROCESSORS,當(dāng)然,你也可能找不到,因為默認(rèn)生成的setting.py中沒出現(xiàn)這個變量。無論如何,確保它的值是

          Python代碼
          TEMPLATE_CONTEXT_PROCESSORS = (   
              "django.core.context_processors.auth",   
              "django.core.context_processors.debug",    
              "django.core.context_processors.i18n",   
              "django.core.context_processors.media",   
              "django.core.context_processors.request"  
          )  
           差不多了,到驗證的時候了。在模板中加入一句{{ request }},是不是看到什么輸出了。使用{{ requset.session}}就可以訪問session了。
          為什么說RequestContext很強(qiáng)大呢,下面接著說TEMPLATE_CONTEXT_PROCESSORS是一個元組,里面的每一個字符串其實(shí)代表了一個可調(diào)用(callable)對象,比如一個函數(shù)或可調(diào)用類。除了可調(diào)用外,它們滿足下面兩個條件: 
             1.只有一個request對象作為參數(shù)
             2.而且要返回一個字典

          你可以自定義context_processor,只要它滿足上面的條件就行。
          RequestContext會把context_processor返回的字典并入自己,也就相當(dāng)于在context中添加了新的內(nèi)容,而這這些內(nèi)容可以直接在模板中訪問。

          默認(rèn)情況下TEMPLATE_CONTEXT_PROCESSORS的值是
          Python代碼
          (
              "django.core.context_processors.auth",    
              "django.core.context_processors.debug",    
              "django.core.context_processors.i18n",    
              "django.core.context_processors.media"
          )  
          所有的processor順序執(zhí)行,如果兩個不同的processor返回的字典中有相同的key,后面的會覆蓋前面的。

          除了在TEMPLATE_CONTEXT_PROCESSORS中添加processor外,你還可以提供RequestContext額外的參數(shù)作為processor,例如
          Python代碼
            c = RequestContext(request, {...}, my_processor_1, my_processor_2...)  
          這種方式更靈活,不過也更麻煩。

          好了,下面看看默認(rèn)的processor都干了些什么

          1.django.core.context_processors.auth
             它給context添加了三個變量(其實(shí)也就是說它返回的字典中有三個key)
             user :如果用戶登錄了,這就是一個auth.User的實(shí)例,代表當(dāng)前用戶。如果用戶沒有登錄,這就是AnonymousUser的實(shí)例,代表當(dāng)前的匿名用戶。
             messages: 傳給當(dāng)前用戶的信息列表。
             perms: django.core.context_processors.PermWrapper的實(shí)例,表示當(dāng)前用戶的授權(quán)。

          2.django.core.context_processors.debug
          這個家伙很懶,就算你把它放到了TEMPLATE_CONTEXT_PROCESSORS里,它也不愿意干活,你還要做點(diǎn)額外的工作才行。首先要確保在配置文件中DEBUG變量的值為True,然后,設(shè)置 INTERNAL_IPS,保證你的ip( 在request.META['REMOTE_ADDR']里可以看到 )在里面。
          Python代碼
          INTERNAL_IPS = ('127,0.0.1', ) #這是一個元組,每個ip都是字符串表示,本機(jī)設(shè)成127.0.0.1  都是字符串表示,做完這些,這家伙才開始工作。它給context添加了兩個變量
             debug :True,這樣我們可以在模板中使用{% if debug %}調(diào)試{% endif %}進(jìn)行模板調(diào)試
             sql_queries: 表示本次請求所執(zhí)行的sql的字典列表,列表中的每個字典表示一次sql查詢,字典的格式是:{'sql':..., 'time':...},sql表示執(zhí)行的sql語句,time表示執(zhí)行這條語句所用的時間。這個功能實(shí)在太棒了,能查看生成的sql語句,心里踏實(shí)?。?/p>

          3.django.core.context_processors.i18n這個processor比較簡單,它也是添加兩個變量(或者說key?)
             LANGUAGES :配置文件中的 LANGUAGES
             LANGUAGE_CODE :如果reqeust中有 LANGUAGE_CODE,這個值等于request. LANGUAGE_CODE,否則這個值是配置文件中的 LANGUAGE_CODE。 
            如果不使用這個,想在頁面獲取這兩個值可以使用:
            {% get_current_language as LANGUAGE_CODE %}
            {{LANGUAGE_CODE}}
            {% get_available_languages as LANGUAGES %}|
            {{LANGUAGES}}

          4.django.core.context_processors.media
             media processor是在Django1.0中才出現(xiàn)的,它使context包含MEDIA_URL,context[' MEDIA_URL '] = 配置文件中的MEDIA_URL。

          5.django.core.context_processors.request
             添加一個變量request,表示當(dāng)前請求的HttpRequest對象。

          最重要的是可以自定義processor,如果很多模板頁面都需要某個數(shù)據(jù),自帶的processor又無法滿足,那就自己寫一個出來,不就是一個函數(shù)嘛,簡單!

          posted on 2008-12-04 12:58 周銳 閱讀(816) 評論(0)  編輯  收藏 所屬分類: Python
          主站蜘蛛池模板: 康马县| 丰宁| 通化市| 南乐县| 渝北区| 台山市| 定安县| 浦城县| 桃园市| 民丰县| 大兴区| 洮南市| 二手房| 根河市| 和林格尔县| 琼海市| 通榆县| 中阳县| 商丘市| 集安市| 伊宁县| 呼图壁县| 兴和县| 淳化县| 彭州市| 二连浩特市| 临城县| 涟源市| 上杭县| 那坡县| 阜南县| 青龙| 庐江县| 龙川县| 洱源县| 讷河市| 胶南市| 增城市| 民勤县| 武川县| 屯留县|