我有一个自定义过滤器user_tz,它将用户作为参数。它在任何地方都可以正常工作,但是当我尝试在regroup标记中使用此过滤器时,它无法说用户不存在。
代码:
{%regroup proj_messages.object_list by created_on | user_tz:user as proj_message_list%}
这是我得到的错误: 渲染时捕获异常:在“今天的任务”中找到键[user]的失败。
谢谢, 马苏德艾哈迈德
答案 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 。