35

我正在为一家小公司开发一个小型 Intranet 站点,用户应该可以在该站点上发帖。我设想了一种非常简单的身份验证机制,人们只需输入他们的电子邮件地址,并收到一个唯一的登录 url,它会设置一个 cookie,该 cookie 将始终在未来的请求中识别他们。

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

还是我必须制作自己的自定义快捷方式才能正确设置上下文?

4

8 回答 8

46

如果您已经拥有in并且正在视图中使用,则无需为用户对象编写上下文处理器。"django.core.context_processors.auth"TEMPLATE_CONTEXT_PROCESSORS RequestContext

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

于 2009-06-30T16:14:29.420 回答
33

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

@Staale:每次在视图中调用模板时都将用户添加到上下文中,DRY

解决方案是使用预处理器

:在您的设置中添加

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

B:在 myapp/processor_file_name.py 中插入

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

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

{{ user.get_full_name }}
于 2008-11-06T16:05:03.300 回答
20

在不必在每个视图中显式设置变量的更一般意义上,听起来您想看看编写自己的上下文处理器

从文档:

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

于 2008-09-03T12:31:58.703 回答
3

提示在每个答案中,但对于新手来说,再次来自“从头开始”:

默认情况下,身份验证数据(几乎)在模板中——有一个小技巧:

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

如果未使用RequestContext ,则此模板上下文变量不可用。

于 2012-08-09T07:28:58.870 回答
2

如果您可以将您的身份验证挂钩到Django 身份验证方案,您将能够使用request.user.

我认为这应该只是一个调用的情况,authenticate()并且login()基于你的 Cookie 的内容。

编辑:@Staale - 我总是在我的上下文中使用这个locals()技巧,所以我的所有模板都可以看到request等等request.user。如果你不是那么我想它不会那么简单。

于 2008-09-03T12:28:34.810 回答
2

@Dave 要在我的模板中使用 {{user.username}},我将不得不使用 requestcontext 而不仅仅是普通的地图/哈希: http: //www.djangoproject.com/documentation/templates_python/#subclassing-context-请求上下文

所以我猜模板引擎没有检查全局变量。

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

于 2008-09-03T12:33:31.583 回答
1

默认情况下,通过执行以下步骤,确保您在设置中添加了上下文“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

于 2011-01-27T11:15:12.407 回答
0

使用 context_processors。https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-TEMPLATES-OPTIONS

设置.py

'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'myapp.functions.test'
        ],
},

myapp/functions.py

def test(request):
    return {'misc': 'misc'}
于 2019-11-03T19:10:54.303 回答