Django找出用户是否在自定义标签中进行了身份验证

时间:2011-01-02 02:37:19

标签: 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/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而不是Context?

编辑:

是否可以在自定义标记内获取RequestContext,我仍然有兴趣知道从自定义标记中确定用户身份验证状态的“正确”或最佳方法。如果这不可能,那么这种逻辑可能属于其他地方?在哪里?

4 个答案:

答案 0 :(得分:3)

默认情况下,django.template.Context的实例用于呈现模板,但您可以在视图中覆盖此实例,方法是将django.template.Context的子类作为context_instance关键字参数传递给render_to_response,或通过实例化子类,并将其直接传递给Template.render

为方便起见,Django提供了一个有用的,预定义的Context子类:django.template.RequestContextRequestContext在您的设置文件中查找名为TEMPLATE_CONTEXT_PROCESSORS的设置,该设置应该是可调用对象的元组,每个对象都应返回一个字典; RequestContext将遍历每个可调用对象,调用它,并将其返回的字典中的键/值对作为变量添加到模板上下文中。请查看these links以获取更详细的说明。

要将当前用户添加到模板上下文,您需要django.core.context_processors.auth

  1. 添加django.core.context_processors.auth上下文 处理器到您的上下文列表 settings.py中的处理器:

    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.auth',
        ... # Other context processors follow
    )
    
  2. 确保视图比呈现调用的模板 您的自定义代码使用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))
    
  3. 使用RequestContext调用定义的所有上下文处理器 在settings.TEMPLATE_CONTEXT_PROCESSORS中,包括。{ 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
    

答案 1 :(得分:1)

我没看到你的视图如何链接到模板标签,因为从我所知道的django的模板系统呈现标签,所以上下文是一个字典,试试这个,希望它有所帮助

user = context['user']
if  user.is_authenticated():
     do stuff

答案 2 :(得分:1)

模板节点的“上下文”与RequestContext不同。 Context也是字典,因此如果它有用户,则可以通过context['user']访问。

模板节点上下文包含帮助它在模板中呈现自身的信息,在对文档进行一些阅读之后,我找不到任何方法来访问RequestContextdjango.template.Context将通过{{django.template.RequestContext与请求相关联1}}。


此外django.template.Context专门从Context扩展,以便处理包含用户的添加请求对象。因此Context无法访问它就不足为奇了。

请参阅django.template.resolve_variable的{​​{3}}以获取证明。

如何获取用户

经过一些搜索后,我找到了from django.template import resolve_variable user = resolve_variable('user', context) 方法,可以按如下方式使用:

context

{{1}}是模板上下文。

答案 3 :(得分:1)

我最后只是将“user”参数传递给标记,并使用它来决定用户是否已被授权。