【问题标题】:Getting username in Django on every single page regardless of how I got there无论我如何到达那里,在每个页面上都在 Django 中获取用户名
【发布时间】:2015-06-05 15:24:06
【问题描述】:

这是比具体代码问题更多的理论问题。

我有点困惑如何在 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 页面从处理器获取上下文数据,它可以工作,我的错是我没有事先检查两次。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • hm...这很奇怪,我已启用所有功能并已登录,但由于某种原因,例如使用 HttpResponseRedirect 访问的页面无法输出 {{user.username}} ....我会尝试调试,但是...
    • 阅读我回答的最后一段。如果您使用render_to_response() 快捷方式,那么您应该传递有效的context_instance 参数。
    • 或者,更好的是,使用render() 调用而不是render_to_response()
    • 但是如果我需要使用 HttpResponseRedirect 怎么办?我当然可以绕过它,但它需要更多的代码。
    • HttpRenderToResponse?你的意思是HttpResponseRedirect?你不应该做任何特别的事情。这只是一个普通的重定向,它不会改变会话数据,
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2022-10-06
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多