3

顯示的信息在這裏是爲您的難題,Django的消息傳遞框架,儘管沒有RequestContext的

使用Django 1.4,我不能獲得通過消息中間件設置在我的模板,以顯示消息。我梳理了Django docs,並確保我的settings.py文件引用了相關的應用程序,上下文處理器和中間件。 我已經確保我的視圖是使用RequestContext實例呈現的。但是,我仍然無法獲得任何消息出現在模板中。

settings.py:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
) 
... 
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth', 
'django.core.context_processors.debug', 
'django.core.context_processors.i18n', 
'django.core.context_processors.request', 
'django.core.context_processors.media', 
'django.core.context_processors.static', 
'django.contrib.messages.context_processors.messages', 
'tekextensions.context_processors.admin_media_prefix', 
) 
... 
INSTALLED_APPS = (
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', #Admin interface 
'django.contrib.admindocs', #Admin docs 
... 

我的郵件error_level被設置爲20(即 '信息' 及以上)。我正在使用默認映射。

views.py:

from django.contrib import messages 

def index(request, *args, **kwargs): 
    #Do some funky jazz which works like build the timeline & page vars 
    ... 
    messages.error = (request,"Horsey Bollox!") 
    messages.add_message = (request, messages.ERROR,"Why won't this f***ing thing work?") #Attempting alternate method 
    return render_to_response('funkyjazzdirectory/index.html', 
         { 
          'page': page, 
          'timeline': timeline, 
         }, 
         context_instance=RequestContext(request)) 

模板:(funkyjazzdirectory/index.html中)

{% extends "base.html" %} 
{% if messages.error %} 
    <div class="messages-errors"> 
     Error: 
     <ul> 
      {% for msg in messages %} 
       <li>{{msg}}</li> 
      {% endfor %} 
     </ul> 
    </div> 
{% endif %} 
<p> 
    Other stuff such as iterating through {{timeline}} which renders absolutely fine 
</p> 

我還試圖代{{MSG}}與:

<li>{{msg.message}}</li> 

沒有成功秒。

頁面的其餘部分輸出很好,Django不會引發錯誤。控制檯不包含任何異常。生成的HTML代碼不包含div,也不包含任何地方的列表標記。這個擴展的模板(base.html)不使用{{messages}}變量,也不調用使用它的模板標籤。

我曾嘗試將{{messages}}傳遞給index.html模板頂部的測試自定義模板標記。在這裏,我可以這樣做:

def __init__(self, messages): 
    self.messages = messages 
    def render(self, context): 
    l = dir(context[self.messages]) 
     print(l) 

...它產生可能是消息對象的方法/屬性列表。然而,我無法重複這一點,因爲「對於消息中的m而言:」甚至不會運行一次。試圖通過以下方式發現此實體的大小:

print(len(context[self.messages])) 

在控制檯中沒有提供任何內容。

唯一一次我得到它實際輸出的東西是當我手動將消息對象傳遞到render_to_response標記中的模板然後通過messages.error({%for msg in messages.error%})迭代在正確的div中產生了兩個項目符號:第一個項目填充了var dump:「,POST :, COOKIES:{'csrftoken':」...第二個項目符號包含最後一個錯誤信息:「爲什麼這件事情不會起作用嗎?「 (顯然,這只是一個測試,我沒有保留通過render_to_response傳遞的字典中的消息,因爲我知道它應該通過上下文到達模板中)

那麼,我出錯了?

爲什麼在我的模板中看不到我的錯誤消息?爲什麼我甚至不能讓消息出現在控制檯中?

任何一個比我聰明的人都可以擺脫燈光會非常有幫助!

回答

4

您似乎用一種很奇怪的方式來添加一條消息:

messages.error = (request,"Horsey Bollox!") 
messages.add_message = (request, messages.ERROR,"Why won't this f***ing thing work?") 

正確的語法是:

messages.error(request,"Horsey Bollox!") 
messages.add_message(request, messages.ERROR,"Why won't this f***ing thing work?") 

的設置和模板但罰款。

+0

我能說什麼?發現得好!有一個綠色的勾號! 大概不像信息本身那麼奇怪...... – michaeljtbrooks 2012-07-30 19:54:12