6

我经常使用以下方式在我的 Django 应用程序视图中向登录用户显示有关用户操作的消息:

request.user.message_set.create("message to user")

我怎么能为匿名(未登录)用户做同样的事情?匿名用户没有 request.user ,但 Django 文档说使用“会话”中间件可以执行与上述代码相同的操作。链接到会话中间件的 Django 文档声称这是可能的,但我无法从会话文档中找到如何做到这一点。

4

3 回答 3

7

这就是我所做的,使用上下文处理器:

project/application/context.py(检查消息并将它们添加到上下文中):

def messages(request):
    messages = {}
    if 'message' in request.session:
        message_type = request.session.get('message_type', 'error')
        messages = {'message': request.session['message'],
                    'message_type': message_type}
        del request.session['message']
        if 'message_type' in request.session:
            del request.session['message_type']
    return messages

project/settings.py(将上下文添加到TEMPLATE_CONTEXT_PROCESSORS):

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.request",
    "django.core.context_processors.debug",
    "django.core.context_processors.media",
    "django.core.context_processors.auth",
    "project.application.context.messages",  
)

使用上述方法messages,每个请求都会调用该函数,并且它返回的任何内容都将添加到模板的上下文中。有了这个,如果我想给用户一个消息,我可以这样做:

def my_view(request):
    if someCondition:
        request.session['message'] = 'Some Error Message'

最后,在模板中,您可以检查是否有要显示的错误:

{% if message %}
    <div id="system_message" class="{{ message_type }}">
        {{ message }}
    </div>
{% endif %}

消息类型仅用于根据它是什么来设置样式(“错误”、“通知”、“成功”)以及设置方式,您一次只能为用户添加 1 条消息,仅此而已我真的需要,所以它对我有用。它可以很容易地更改以允许多条消息等。

于 2009-03-30T20:45:38.233 回答
4

将数据直接存储在会话中,它是一个类似dict的对象。然后在视图/模板中,检查该值。

更多信息在这里:

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

您还可以创建一个中间件类来检查每个请求的会话对象,并在那里进行构建/拆除。

于 2009-03-30T16:48:33.340 回答
4

请参阅http://code.google.com/p/django-session-messages/直到启用基于会话的消息的补丁登陆 Django 树(正如我最近看到的,它被标记为 1.2,所以没有希望快速添加.. .)。

另一个具有类似功能的项目是 Django Flash ( http://djangoflash.destaquenet.com/ )。

于 2009-04-01T08:56:30.183 回答