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

Getting username in Django on every single page regardless of how I got there

这是理论问题,而不是具体的代码问题。

我有点困惑用户名、用户电子邮件等信息在 Django 中是如何存储和访问的。
据我所知:
我可以像 {{user.username}} 一样访问它,如果我以前通过使用 render()render_to_response() 和里面的 RequestContext 到达这里。如果我使用 HttpResponseRedirect 进入页面,那么我无法访问 user.username,这里只是空白。

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

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

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

这里发生了什么(傻瓜)
HttpResponseRedirect 根本不影响任何东西。问题是它正在重定向到不包含 RequestContext 的 render_to_response() 调用。如果我们不指定 RequestContext,它会将其写为空白并强制它覆盖 context_processor.auth 提供的会话数据,因此您在此页面上基本上没有任何上下文数据。

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

只输出{{ user.username }}。如果用户已登录,某些 auth middleware and django.contrib.auth.context_processors.auth 上下文处理器已启用,则将显示用户名。

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

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