代码之家  ›  专栏  ›  技术社区  ›  Staale

始终在django模板上下文中包含用户

  •  29
  • Staale  · 技术社区  · 17 年前

    我正在为一家小公司开发一个小型的内部网站,用户应该可以在那里发帖。我设想了一种非常简单的身份验证机制,人们只需输入他们的电子邮件地址,并发送一个唯一的登录URL,该URL设置一个cookie,该cookie将始终为将来的请求识别他们。

    在我的模板设置中,我有base.html,其他页面扩展了它。我想在base.html中显示“登录”或“注册”按钮,但如何确保必要的变量始终是上下文的一部分?似乎每个视图只是根据自己的喜好设置上下文,并且没有全局上下文填充。有没有一种方法可以做到这一点而不在每个上下文创建中包含用户?

    或者我必须创建自己的自定义快捷方式来正确设置上下文?

    7 回复  |  直到 9 年前
        1
  •  18
  •   Ryan Duffield    17 年前

    从更一般的意义上讲,不必在每个视图中显式地设置变量,这听起来像是您希望编写自己的 context processor .

    来自文档:

    上下文处理器有一个非常简单的接口:它只是一个python函数,它接受一个参数,一个httpRequest对象,并返回一个添加到模板上下文中的字典。每个上下文处理器必须返回一个字典。

        2
  •  43
  •   Daniel    13 年前

    不需要 如果已经有了 "django.core.context_processors.auth" 在里面 TEMPLATE_CONTEXT_PROCESSORS 如果你在用 RequestContext 在你看来。

    如果您使用的是Django 1.4或最新版本,则模块已移动到 django.contrib.auth.context_processors.auth

        3
  •  33
  •   zalun    9 年前

    @关于预处理器的文档有点小

    @staale:每次调用视图中的模板时都将用户添加到上下文中,dry

    解决方案是使用预处理器

    :在设置中添加

    TEMPLATE_CONTEXT_PROCESSORS = (
        'myapp.processor_file_name.user',
    )
    

    :在myapp/processor_file_name.py中插入

    def user(request):
        if hasattr(request, 'user'):
            return {'user':request.user }
        return {}
    

    从现在开始,您可以在模板中使用用户对象功能。

    {{ user.get_full_name }}
    
        4
  •  3
  •   iutinvg    14 年前

    每个答案中都有提示,但对于新手来说,再一次从“零开始”开始:

    默认情况下,身份验证数据都是模板(几乎)中的数据——只需一个小技巧:

    在里面 views.py :

    from django.template import RequestContext
    ...
    def index(request):
        return render_to_response('index.html', 
                                  {'var': 'value'},
                                  context_instance=RequestContext(request))
    

    在里面 index.html :

    ...
    Hi, {{ user.username }}
    var: {{ value }}
    ... 
    

    从这里: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

    此模板上下文变量在以下情况下不可用: 请求上下文 是 没有被使用。

        5
  •  2
  •   Staale    17 年前

    @戴夫 要在模板中使用user.username,我必须使用 请求上下文而不仅仅是普通映射/哈希: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

    所以我想模板引擎没有检查全局。

    但是RequestContext有一些可预填充的类,我可以研究它们来解决我的问题。谢谢。

        6
  •  2
  •   David Webb    17 年前

    如果您可以将身份验证挂接到 Django authentication scheme 你可以使用 request.user .

    我想这应该只是打电话 authenticate() login() 基于cookie的内容。

    编辑:@staale-我总是使用 locals() trick 用于我的上下文,以便我的所有模板都可以看到 request 如此 请求用户 . 如果你不这样做,我想事情不会那么简单。

        7
  •  1
  •   Anto Binish Kaspar    15 年前

    默认情况下,通过执行以下步骤,确保在设置中添加了上下文“django.contrib.auth.context_processors.auth”。默认情况下,它会添加到settings.py中,因此看起来像这样

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

    你可以访问这样的用户对象,

    {% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
    {% else %}
        <p>Welcome, new user. Please log in.</p>
    {% endif %}
    

    有关详细信息,请参阅此处 http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates