gpt4 book ai didi

Django 模板标签范围迫使我做额外的查询

转载 作者:行者123 更新时间:2023-12-04 19:23:22 24 4
gpt4 key购买 nike

问题是,如果我将模板标签调用到一个块中
它用通常的上下文 [varname]=something 填充了我的变量,
然后如果我需要将该变量放入另一个块中,我必须调用
再次模板标签。这对我来说意味着额外的数据库查询,这真的是
我试图避免的事情。

这个模板标签在一个基本模板中被调用,该模板被扩展为
许多其他模板,所以我不能只更改所有 View 以通过
根据上下文,它没有任何意义(WET 原则?)

即使是上下文处理器也不好,因为我不想
为站点中呈现的每个页面调用它,即使不是基于的页面
在那个模板上。

我正在考虑编写一个模板标签,它将使用
将变量置于全局上下文中的内部上下文结构,
但我会觉得这样做太内疚了。

你会如何解决这个问题?

最佳答案

你说,“这个模板标签在一个由许多其他模板扩展的基本模板中调用。”

问题是:这个标签是从命名块中调用的吗?如果是,那么您有几个潜在的问题。

  • {% block %}在上下文堆栈上推送一个新的 dict 并在它到达匹配的“{% endblock %}”时将其弹出。这意味着在块中创建的任何上下文值在块退出时基本上都超出了范围。
  • 如果此块被扩展基本模板的其他模板覆盖,则该值可能根本不可用,除非您执行 {{block.super}} ,即使那样,我也不确定该值是否可用于进行扩展的模板。

  • 如果标签不是从 {% block %} 中调用的那么上下文值应该可用于跟随它的所有代码,无论是在基本模板、任何包含的模板和(我认为)任何扩展模板中。

    这是构建一组仔细测试可能会节省您的时间和眼泪的情况之一。

    或者,如果你总是访问这个值,你可以把它放在 context processor 中。以保证其可用性。

    评论更新:好的,是时候带上大枪了! Django 模板中最令人恼火、长期存在的错误之一是,作为顶级上下文值的可调用对象(即函数)(与作为 dict 值/上下文值方法的函数相反)没有被调用!这张票已经超过 2 年了,需要大约 10 行代码来修复。我们有几个重量级的数据库调用,我们只希望在模板缓存过期时发生这些调用。所以我们 a) MonkeyPatched 模板 _resolve_lookup()代码来修复可调用问题,然后 b) 如果需要, curry 函数具有所有必要的参数,因为您不能将参数传递给模板“语言”中的函数。

    关于Django 模板标签范围迫使我做额外的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2077050/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com