尽管RequestContext,Django Messaging Framework仍然不显示消息

时间:2012-07-30 19:31:24

标签: django django-templates django-middleware django-messages

这是给你的难题,

使用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(即'info'及以上)。我正在使用默认映射。

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)

...它产生一个可能是消息对象的方法/属性列表。然而,我根本无法对此进行迭代,因为“for m in messages:”甚至不会运行一次。试图通过以下方式发现该实体的大小:

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

在控制台中没有给我任何东西。

我实际输出任何内容的唯一一次是当我手动将消息对象传递到render_to_response标记内的模板中,然后迭代生成的messages.error({%for msg in messages.error%})正确div中的两个要点:第一个看起来像var转储:“,POST:,COOKIES:{'csrftoken':”......第二个项目符号只包含最后一条错误消息:“为什么赢了这件事有用吗?“ (显然这只是一个测试,我没有在通过render_to_response传递的dict中保留消息,因为我知道它应该通过上下文到达模板中)

那么,我哪里出错了?

为什么我的模板中看不到错误消息?为什么我甚至不能将消息显示在控制台中?

任何比我更聪明的人都可以轻松下去!

1 个答案:

答案 0 :(得分: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?") 

然而,设置和模板很好。