我经常使用以下方式向我的Django应用视图中的用户操作显示用户操作的消息:
request.user.message_set.create("message to user")
我如何为匿名(未登录)用户执行相同的操作?匿名用户没有request.user,但Django文档说使用“会话”中间件你可以做与上面代码相同的事情。链接到会话中间件的Django文档声称它是可能的,但我无法从会话文档中找到如何做到这一点。
答案 0 :(得分: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条消息,但这就是我真正需要的,所以它对我有用。它可以很容易地改变以允许多个消息等。
答案 1 :(得分:4)
将数据直接存储在会话中,这是一个类似dict的对象。然后在视图/模板中,检查值。
此处提供更多信息:
http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views
您还可以创建一个中间件类来检查每个请求上的会话对象,并在那里进行构建/拆除。
答案 2 :(得分:4)
请参阅http://code.google.com/p/django-session-messages/,直到启用基于会话的消息的补丁登陆Django树(正如我最近看到的那样,标记为1.2,所以没有希望快速添加......)。
具有类似功能的另一个项目是Django Flash(http://djangoflash.destaquenet.com/)。