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