Django Messaging Framework не отображает сообщение, несмотря на RequestContext

Вот вам загадка,

Используя Django 1.4, я не могу получить сообщения, установленные через промежуточное ПО сообщений, для отображения в моих шаблонах. Я просмотрел документы Django и убедился, что в моем файле 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))

template: (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]))

ничего не дает мне в консоли.

Единственный раз, когда у меня получилось что-то на самом деле выводить, это когда я вручную передавал объект messages в шаблон внутри тега render_to_response, а затем перебирал messages.error ({% для msg в messages.error %}), что давало две точки маркера в правильном div: первый заполняется чем-то вроде дампа var:", POST:, COOKIES:{'csrftoken':"... второй пункт с последним сообщением об ошибке:"Почему это не так? Что, черт возьми, работаешь? (Очевидно, что это был всего лишь тест, и я не сохранил сообщения в файле dict, передаваемом через render_to_response, поскольку я знаю, что он должен поступать в шаблон через контекст)

Итак, где я ошибся?

Почему я не вижу свои сообщения об ошибках в моем шаблоне? Почему я не могу даже заставить сообщения появляться в консоли?

Любой свет, который кто-то умнее меня может пролить, был бы чрезвычайно полезным!

1 ответ

Решение

Вы, кажется, используете очень странный способ добавить сообщение:

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?") 

Настройки и шаблоны, однако, в порядке.

Другие вопросы по тегам