使用auth.views进行Django身份验证
用户在注册后和注销后都应该被重定向到登录页面。在这两种情况下,都需要显示一条相关的信息提示。
使用 django.contrib.auth.views.login
,我该如何发送这些 {{ info }} 消息呢?
一个可能的办法是把 auth.views
复制到新的注册模块中,并包含所有必要的内容。但这样做似乎不够简洁。
那么,最好的方法是什么呢?
更新:问题详细说明:
在正常情况下,当你想告诉用户某个操作的反馈时,可以使用
request.user.message_set.create()
这会创建一条消息,在某个模板中显示,并会自动删除。
但是这个消息系统只适用于已经登录的用户,因为他们的会话ID是相同的。在注册的情况下,用户并没有通过身份验证,而在注销的情况下,由于会话发生了变化,这个系统就不能用了。
再加上,内置的 login
和 logout
函数来自 django.contrib.auth.views
,它们返回的是 'HttpResponseRedirect',这使得在模板中添加其他变量变得不可能。
我尝试在请求对象上设置一些东西
request.info='Registered'
并在一个 不同的视图 中检查这个
try:
info = request.info:
del request.info
except:
info = ''
#later
render_to_response('app/file',{'info':info})
但这也没有成功。
显然,我可以定义一个 registered.html,并在里面添加这条静态消息,但我懒得再写一个模板,想要保持代码的简洁。
我意识到“注册”消息和“注销”消息的情况是不同的。我将我使用的简洁方法写成一个答案。
3 个回答
你可以使用请求上下文处理器,把这些信息添加到每个被渲染的模板的上下文中。
这种方法是“零影响”的,意思是你不需要修改任何视图函数,所以它符合一些“不要重复自己”(DRY)的原则。
详细信息可以查看 这个链接
首先,写一个你自己的 login.html 模板。
其次,写一个自己的上下文函数,用来提供任何需要插入模板的额外信息。
最后,更新设置,把你的上下文处理器添加到 TEMPLATE_CONTEXT_PROCESSORS
设置中。
如果这些消息是固定不变的,你可以为这些视图使用你自己的模板:
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}
来自文档。
我觉得解决这个问题最好的办法是使用一种“闪存”类型的基于会话的消息系统。现在有几种这样的系统在流行:django-flash 看起来非常不错,而我使用的是django-session-messages,这个系统非常简单。希望到我们使用Django 1.2的时候,这个功能能直接内置进来。