Python Django查明用户是否在自定义标记中经过身份验证
我正在尝试创建一个自定义标记。在这个自定义标记中,我希望能够有一些逻辑来检查用户是否登录,然后相应地呈现标记。这就是我所拥有的:Python Django查明用户是否在自定义标记中经过身份验证,python,django,django-templates,Python,Django,Django Templates,我正在尝试创建一个自定义标记。在这个自定义标记中,我希望能够有一些逻辑来检查用户是否登录,然后相应地呈现标记。这就是我所拥有的: def user_actions(context): request = template.Variable('request').resolve(context) return { 'auth': request['user'].is_athenticated() } register.inclusion_tag('layout_elements/
def user_actions(context):
request = template.Variable('request').resolve(context)
return { 'auth': request['user'].is_athenticated() }
register.inclusion_tag('layout_elements/user_actions.html', takes_context=True)(user_actions)
当我运行此操作时,会出现以下错误:
Caught VariableDoesNotExist while rendering: Failed lookup for key [request] in u'[{}]'
渲染此内容的视图的结尾如下所示:
return render_to_response('start/home.html', {}, context_instance=RequestContext(request))
为什么标记不获取RequestContext对象而不是Context对象?如何让标记接收RequestContext而不是上下文
编辑:
无论是否有可能在自定义标记中获取RequestContext,我仍然有兴趣知道从自定义标记中确定用户身份验证状态的“正确”或最佳方法。如果这是不可能的,那么这种逻辑可能属于其他地方?在哪里?我看不出您的视图是如何链接到模板标记的,因为据我所知,它的django模板系统呈现标记,因此上下文是一个字典,试试这个,希望它能有所帮助
user = context['user']
if user.is_authenticated():
do stuff
我看不出您的视图是如何链接到模板标记的,因为据我所知,它的django模板系统呈现标记,因此上下文是一个字典,试试这个,希望它能有所帮助
user = context['user']
if user.is_authenticated():
do stuff
模板节点的“上下文”与RequestContext
不同。Context
也是一个字典,因此如果它有用户,则可以通过Context['user']
访问它
template nodes上下文包含帮助它在模板中呈现自身的信息,在阅读了一些文档之后,我找不到任何方法来访问RequestContext
,它将通过django.template.context
与请求相关联
此外,
django.template.RequestContext
扩展自django.template.Context
,特别是为了处理添加的包含用户的请求对象。因此,上下文
无法访问它也就不足为奇了
有关证明,请参见上下文中的
如何获取用户
经过一段时间的搜索,我找到了django.template.resolve_variable
方法,该方法可以如下使用:
from django.template import resolve_variable
user = resolve_variable('user', context)
其中,上下文
是模板上下文。模板节点的“上下文”与请求上下文
不同。Context
也是一个字典,因此如果它有用户,则可以通过Context['user']
访问它
template nodes上下文包含帮助它在模板中呈现自身的信息,在阅读了一些文档之后,我找不到任何方法来访问RequestContext
,它将通过django.template.context
与请求相关联
此外,django.template.RequestContext
扩展自django.template.Context
,特别是为了处理添加的包含用户的请求对象。因此,上下文
无法访问它也就不足为奇了
有关证明,请参见上下文中的
如何获取用户
经过一段时间的搜索,我找到了django.template.resolve_variable
方法,该方法可以如下使用:
from django.template import resolve_variable
user = resolve_variable('user', context)
其中,context
是模板上下文。默认情况下,django.template.context的实例用于呈现模板,但您可以在视图中覆盖该实例,通过将django.template.Context
的子类作为Context\u实例
关键字参数传递给render\u to\u response
,或者通过实例化子类,并将其直接传递给template.render
为了方便起见,Django提供了一个有用的预定义的Context
子类:Django.template.RequestContext
RequestContext
在设置文件中查找名为的设置,该设置应为可调用对象的元组,每个对象应返回一个字典RequestContext
将循环调用每个可调用项,并将其返回的字典中的键/值对作为变量添加到模板上下文中。查看更详细的解释
要将当前用户添加到模板上下文,您需要django.core.context\u processors.auth
:
添加django.core.context\u processors.auth
context
将处理器添加到上下文列表中
settings.py中的处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
... # Other context processors follow
)
确保视图不会呈现调用
您的自定义标记使用RequestContext
:
from django.template.context import RequestContext
from django.shortcuts import render_to_response
def my_view(request):
# Do some stuff
return render_to_response('templates/view.html',
context_instance=RequestContext(request))
使用RequestContext
调用定义的所有上下文处理器
在设置.模板\u上下文\u处理器中
,包括
auth
上下文处理器,它添加了一个上下文变量“user”
添加到模板上下文。
在模板标记中,可以访问此变量
通过context['user']
@register.inclusion_tag('templates/custom/tag.html', takes_context=True)
def custom_tag(context):
user = context['user']
if user.is_authenticated():
# Some stuff for the logged-in users
else:
# Stuff for anonymous users
默认情况下,django.template.Context
的实例用于呈现模板,但您可以在视图中覆盖该实例,方法是将django.template.Context
的子类作为Context\u实例
关键字参数传递给render\u响应
,或者实例化子类,并将其直接传递给模板.render
为了方便起见,Django提供了一个有用的预定义的Context
子类:Django.template.RequestContext
RequestContext
在设置文件中查找名为的设置,该设置应为可调用对象的元组,每个对象应返回一个字典RequestContext
将循环调用每个可调用项,并将其返回的字典中的键/值对作为变量添加到模板上下文中。查看更详细的解释
要将当前用户添加到模板上下文,您需要django.core.context\u processors.auth
:
添加d