Django重新组合标签问题

时间:2009-08-29 06:36:04

标签: django django-templates

我有一个自定义过滤器user_tz,它将用户作为参数。它在任何地方都可以正常工作,但是当我尝试在regroup标记中使用此过滤器时,它无法说用户不存在。

代码:

{%regroup proj_messages.object_list by created_on | user_tz:user as proj_message_list%}

这是我得到的错误: 渲染时捕获异常:在“今天的任务”中找到键[user]的失败。

谢谢, 马苏德艾哈迈德

1 个答案:

答案 0 :(得分:0)

奇怪的是,我偶然发现了这个问题。 虽然后来我不得不改变我的代码,但我无法解决它的问题。显然会发生的事情如下所示。

无论您在模板中编写什么,都会被分割为节点,变量等。渲染时的变量将在该实例可用的上下文中进行搜索。请注意,对于regroup标记,可用的上下文就是object_list,您将其作为第一个参数传递。 不是通常的上下文(在您的情况下包含'user'),这是整个模板的全局。因此,它无法找到您指定的任何其他变量,而不是您{{1 }}

因此,在您的情况下,重新组合的上下文是来自object_list的对象。因此解析器代码能够在上下文中找到变量proj_messages.object_list,但不能找到created_on。这就是抛出模板异常的原因。

考虑到这一点,想象一下,如果您的user也具有object_list属性,会发生什么。在这种情况下,不会有任何KeyError,但是 user传递给过滤器,而不是你打算传递的user变量。

根据要求修改 没有直接的方法,将user传递给regroup标签中使用过滤器。但是一种黑客攻击显然会起作用。注意,它只是一个黑客。使user的每个实体/对象包含该视图中的用户变量,或者使用模板中object_list上的额外过滤器。 但更好的是,如果你希望proj_messages.object_list可以在任何地方使用,从上下文之外,我希望你考虑另一个黑客。退房, http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser