使用auth.views进行Django身份验证

2 投票
3 回答
2450 浏览
提问于 2025-04-15 11:59

用户在注册后和注销后都应该被重定向到登录页面。在这两种情况下,都需要显示一条相关的信息提示。

使用 django.contrib.auth.views.login,我该如何发送这些 {{ info }} 消息呢?

一个可能的办法是把 auth.views 复制到新的注册模块中,并包含所有必要的内容。但这样做似乎不够简洁。

那么,最好的方法是什么呢?

更新:问题详细说明:

在正常情况下,当你想告诉用户某个操作的反馈时,可以使用

request.user.message_set.create()

这会创建一条消息,在某个模板中显示,并会自动删除。

但是这个消息系统只适用于已经登录的用户,因为他们的会话ID是相同的。在注册的情况下,用户并没有通过身份验证,而在注销的情况下,由于会话发生了变化,这个系统就不能用了。

再加上,内置的 loginlogout 函数来自 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 个回答

0

你可以使用请求上下文处理器,把这些信息添加到每个被渲染的模板的上下文中。

这种方法是“零影响”的,意思是你不需要修改任何视图函数,所以它符合一些“不要重复自己”(DRY)的原则。

详细信息可以查看 这个链接

首先,写一个你自己的 login.html 模板。

其次,写一个自己的上下文函数,用来提供任何需要插入模板的额外信息。

最后,更新设置,把你的上下文处理器添加到 TEMPLATE_CONTEXT_PROCESSORS 设置中。

3

如果这些消息是固定不变的,你可以为这些视图使用你自己的模板:

(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}

来自文档

1

我觉得解决这个问题最好的办法是使用一种“闪存”类型的基于会话的消息系统。现在有几种这样的系统在流行:django-flash 看起来非常不错,而我使用的是django-session-messages,这个系统非常简单。希望到我们使用Django 1.2的时候,这个功能能直接内置进来。

撰写回答