无论我如何到达,都会在每个页面上获取Django中的用户名

时间:2015-04-01 04:45:30

标签: django session django-templates django-views django-sessions

这是比特定代码问题更多的理论问题。

我很困惑如何在Django中存储和访问用户名,用户电子邮件等信息 据我所知:
我可以像{{user.username}} IF一样使用render()render_to_response()使用RequestContext来访问它。如果我使用HttpResponseRedirect登录页面,而无法访问user.username,则此处只是空白。

我想知道的事:
有没有办法从每个页面访问用户数据,无论我如何到达那里?我的意思是即使我根本不使用任何视图,例如手动输入地址 奇怪的是,我一直认为像用户名这样的数据可以通过会话访问,但是关于这个主题的10篇文章中有9篇总是谈论RequestContext和其他将值从一个页面传递到另一个页面的东西。

我还阅读了自定义上下文处理器,但我认为它只适用于特定用途,而不是简单的用户名。

所以也许简而言之,问题是:
如果我想在网站的每个页面的角落显示例如用户名 - 我该怎么做?

这里会发生什么(对于傻瓜)
HttpResponseRedirect根本不会影响任何事情。问题是它正在重定向到不包含RequestContext的render_to_response()调用。如果我们没有指定RequestContext,它会把它写成空白并强制它覆盖context_processor.auth给出的会话数据,所以你基本上没有任何东西作为你在这个页面的上下文数据。

应该如何完成(在我看来)是你总是在任何视图中使用带有RequestContext的render()或render_to_response(),不要忘记它。并且不要担心各种重定向,因为它们不会影响上下文数据。静态html页面从处理器获取上下文数据,它可以工作,我的错,我事先没有检查过两次。

1 个答案:

答案 0 :(得分:1)

输出{{ user.username }}。如果用户已登录,则会启用某些auth middlewaredjango.contrib.auth.context_processors.auth上下文处理器,然后会显示用户名。

中间件从会话中获取用户标识,从数据库加载User并设置request.user属性。然后上下文处理器获取request.user属性并将其作为user变量注入RequestContext。

要使模板中的user变量可用,您应该使用render()快捷方式。或者render_to_response()RequestContext作为context_instance参数。