【问题标题】:Overriding module method on Django start在 Django 启动时覆盖模块方法
【发布时间】:2012-04-25 12:57:41
【问题描述】:

我使用django.contrib.messages 模块来创建刷新消息。这些消息可以显示在页面的不同块中,取决于额外的标签:

messages.error(request, 'Error message', extra_tags='form')

我有名为“global”的默认标签,如果没有设置额外标签,我需要将它添加到新消息中。所以我写了中间件来包装django.contrib.messages.add_message()应用程序启动的方法:

class Initialization:
    def __init__(self):
        self.init_messages()
        raise MiddlewareNotUsed

    def init_messages(self):
        add_message_method = messages.add_message
        def add_message_wrapper(request, level, message, extra_tags='', fail_silently=False):
            if not extra_tags:
                extra_tags = 'global'
            add_message_method(request, level, message, extra_tags, fail_silently)
        messages.add_message = add_message_wrapper

我看到调用了init_messages()方法,但是当我调用django.contrib.messages.add_message()时,它没有被add_message_wrapper()包裹。

我的失败在哪里?

【问题讨论】:

  • 你打电话给messages.add_message()messages.error()

标签: django python-module django-middleware


【解决方案1】:

您不能直接将“启动代码”添加到settings.pyviews.py 中吗?

如果您所做的只是在 extra_tags 为空时添加默认值 "global",您也可以在呈现消息时在页面模板中执行此操作:

{% if not message_obj.tags %}
    // Use "global"
{% else %}
    // Use {{message_obj.tags}}
{% endif %}

这也可以在您的视图代码中完成:

storage = messages.get_messages(request)
for message in storage:
    if not message.tags:
        message.tags = "global"
storage.used = False

有关更多信息,请参阅 Django 文档https://docs.djangoproject.com/en/dev/ref/contrib/messages/#expiration-of-messages

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多