你说,“这个模板标签在一个由许多其他模板扩展的基本模板中被调用。”
问题是:这个标签是从命名块中调用的吗?如果是这样,那么你有几个潜在的问题。
{% block %}
在上下文堆栈上推送一个新字典,并在到达匹配的“{% endblock %}”时将其弹出。这意味着在块中创建的任何上下文值在块退出时基本上已经超出了范围。
如果此块被扩展基本模板的其他模板覆盖,则该值可能根本不可用,除非您执行 a {{block.super}}
,即使那样我也不确定该值是否可用于进行扩展的模板。
如果标签不是从 a 中调用的,{% block %}
那么上下文值应该可用于它后面的所有代码,无论是在基本模板、任何包含的模板和(我认为)任何扩展模板中。
这是构建一组仔细测试可能会节省您的时间和眼泪的情况之一。
或者,如果您总是访问此值,则可以将其放入上下文处理器中,以保证其可用性。
更新评论:好的,是时候引入大炮了!Django 模板中最烦人、长期存在的错误之一是,作为顶级上下文值的可调用对象(即函数)(与作为上下文值的字典值/方法的函数相反)没有被调用!这张票已经超过 2 年了,大约需要 10 行代码来修复。我们有几个重量级的数据库调用,我们只希望在模板缓存过期时发生。所以我们 a) MonkeyPatched 模板_resolve_lookup()
代码以修复可调用问题,然后 b) curry 函数以在需要时具有所有必要的参数,因为您不能将参数传递给模板“语言”中的函数。