我正在尝试创建自定义标记。在这个自定义标记内,我希望能够有一些逻辑来检查用户是否已登录,然后相应地呈现标记。这就是我所拥有的:
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,我仍然有兴趣知道从自定义标记中确定用户身份验证状态的“正确”或最佳方法。如果这不可能,那么这种逻辑可能属于其他地方?在哪里?
答案 0 :(得分:3)
默认情况下,django.template.Context
的实例用于呈现模板,但您可以在视图中覆盖此实例,方法是将django.template.Context
的子类作为context_instance
关键字参数传递给render_to_response
,或通过实例化子类,并将其直接传递给Template.render
。
为方便起见,Django提供了一个有用的,预定义的Context
子类:django.template.RequestContext
。 RequestContext
在您的设置文件中查找名为TEMPLATE_CONTEXT_PROCESSORS
的设置,该设置应该是可调用对象的元组,每个对象都应返回一个字典; RequestContext
将遍历每个可调用对象,调用它,并将其返回的字典中的键/值对作为变量添加到模板上下文中。请查看these links以获取更详细的说明。
要将当前用户添加到模板上下文,您需要django.core.context_processors.auth
:
添加django.core.context_processors.auth
上下文
处理器到您的上下文列表
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
调用定义的所有上下文处理器
在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']
访问。
模板节点上下文包含帮助它在模板中呈现自身的信息,在对文档进行一些阅读之后,我找不到任何方法来访问RequestContext
,django.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”参数传递给标记,并使用它来决定用户是否已被授权。