【问题标题】:Django: How to write current users name from every view (django)Django:如何从每个视图中写入当前用户名(django)
【发布时间】:2009-06-28 19:36:25
【问题描述】:

我正在编写小型社交应用程序。其中一项功能是在站点的标题中写入用户名。例如,如果我登录并且我的名字是 Oleg(用户名),那么我应该看到:

你好,奥列格 |点击编辑个人资料

否则我应该看到类似:

您好,请注册或加入

我想要在我网站的每个页面上显示这个。显而易见的解决方案是将 request.user 对象传递到我网站的每个视图中。但是这里http://www.willmer.com/kb/category/django/ 我读到我可以简单地从任何模板访问请求对象,只需启用:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)

不知道为什么,但实际上没有用:(

也许有人可以帮助我并提出解决方案?

非常感谢,

奥列格

【问题讨论】:

    标签: django


    【解决方案1】:

    另外请注意,如果您不需要整个请求上下文,则应使用 django.core.context_processors.auth 而不是 django.core.context_processors.request。然后你可以简单地输入:

    Hello {{ user.get_full_name }}
    

    在您的模板中。

    当您调用render_to_response(或使用direct_to_template)时,不要忘记传递context_instance=RequestContext(request)

    【讨论】:

    • 请注意:通用视图已经设置了 context_instance,因此 {{ user }} 变量已经可用。
    【解决方案2】:

    这里可能有两个问题。

    首先,如果您重新定义TEMPLATE_CONTEXT_PROCESSORS,您将覆盖默认值,这可能不是一个好主意。默认情况下,该设置已经包含auth 处理器,它无论如何都会为您提供user 变量。如果你也确实需要request,你应该这样做(注意+=):

    TEMPLATE_CONTEXT_PROCESSORS += (
        'django.core.context_processors.request',
    )
    

    其次,如文档here 中所述,使用上下文处理器时,您需要确保在模板中使用 RequestContext。如果你使用render_to_response,你应该这样做:

    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))
    

    【讨论】:

      【解决方案3】:

      使用

      从 django.template 导入 RequestContext

      而不是

      从 django.template 导入上下文

      所以现在只需调用 RequestContext(request, context)

      更多here.

      【讨论】:

        【解决方案4】:

        一旦您设置了上下文流程,请求就会作为名为@9​​87654323@ 的变量传递给模板。要访问用户对象,您需要深入了解它:

        {{ request.user }}
        

        这是list of attributes stored in the Django Request object。更具体地说,这里是user attribute

        【讨论】:

          【解决方案5】:
          {% if user.is_authenticated %}
          <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
          {% else %}
          <p>Welcome, new user. Please log in.</p>
          {% endif %}
          

          如果您已经设置了 TEMPLATE_CONTEXT_PROCESSORS 就足够了。

          【讨论】:

            【解决方案6】:

            我觉得只要加上locals()就可以解决问题了。

            return render_to_response('my_template.html',
                                  my_data_dictionary,locals())
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-08-07
              • 1970-01-01
              • 2016-02-21
              • 2021-02-26
              • 2013-12-07
              • 2017-06-03
              • 2011-05-29
              相关资源
              最近更新 更多