【问题标题】:Django messages framework not working in template loopDjango 消息框架在模板循环中不起作用
【发布时间】:2011-09-27 12:33:19
【问题描述】:

我最近升级到 Django 1.3,我想开始使用 Messages 系统。

我已将中间件、模板上下文处理器和消息添加到 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'>

有什么想法吗?

【问题讨论】:

  • 上次发生这样的事情在我身上,我认为有问题。所以引用 DrTyrsa 的话,展示你的观点。
  • 你有没有解决这个问题我也被这个问题困扰

标签: django django-middleware django-1.3 django-context


【解决方案1】:

我刚遇到这个问题。我在上下文处理器中包含以下内容:

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

确保您没有在上下文中设置messages,因为django.contrib.messages.context_processors.messages 以正确的方式设置了它。

【讨论】:

    【解决方案2】:

    settings.py 中的 MIDDLEWARE_CLASSES 和 TEMPLATE_CONTEXT_PROCESSORS 是怎么弄的,应该是这样的:

    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 %}
    

    希望对你有帮助。

    【讨论】:

    • 复制并粘贴我的配置,也尝试移动一些项目,仍然没有运气
    • 您是否在模板视图中使用 {% if messages %}?
    猜你喜欢
    • 2011-05-20
    • 2022-07-25
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2022-01-11
    相关资源
    最近更新 更多