Рамка сообщений Django не работает в цикле шаблона - PullRequest
3 голосов
/ 27 сентября 2011

Я недавно обновился до Django 1.3 и хочу начать использовать систему сообщений.

Я добавил свои Middleware, обработчики контекстов шаблонов, а также сообщения в INSTALLED_APPS

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
    'facebook.djangofb.FacebookMiddleware',
    'annoying.middlewares.RedirectMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)

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",
    "django.contrib.messages.context_processors.messages",
)

INSTALLED_APPS = (
    'django.contrib.messages',
)

Я просто тестирую на основе представления, которое делает простой расчет.

в админе, сообщения отображаются, однако при попытке отобразить их в моем файле base.html я получаю следующую ошибку.

Caught TypeError while rendering: 'module' object is not iterable

и в стеке здесь происходит сбой.

{% for message in messages %}

Я также удалил оператор for, но я все еще получаю следующую ошибку, ничего более

<module 'django.contrib.messages' from '/Users/ApPeL/.virtualenvs/mysite.com/lib/python2.7/site-packages/django/contrib/messages/__init__.py'>

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Я только что столкнулся с этой проблемой. Я включил в свой контекстный процессор следующее:

from django.contrib import messages
...
def allrequests(request):
    ctx = {
        ...
        'messages': messages
    }
    return ctx

Убедитесь, что вы не устанавливаете messages в контексте, так как он установлен правильно django.contrib.messages.context_processors.messages.

0 голосов
/ 27 сентября 2011

Как вы MIDDLEWWARE_CLASSES и TEMPLATE_CONTEXT_PROCESSORS в settings.py, должно выглядеть так:

MIDDLEWARE_CLASSES = (
  'django.middleware.common.CommonMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.csrf.CsrfViewMiddleware',
  'django.middleware.csrf.CsrfResponseMiddleware',
  'django.middleware.locale.LocaleMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
)

TEMPLATE_CONTEXT_PROCESSORS = (
   "django.contrib.auth.context_processors.auth",
   "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"
)

И в INSTALLED_APPS:

'django.contrib.messages'

А в твоем шаблоне (ты забыл if?):

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
 {% endif %}

Надеюсь, это поможет вам.

...