【问题标题】:Dynamically include template elements from other apps in Django在 Django 中动态包含来自其他应用程序的模板元素
【发布时间】:2009-08-05 22:25:06
【问题描述】:

App_1 有一个视图和该视图的模板。它希望将来自其他来源(即其他应用程序)的信息“聚合”到此视图中,而无需自行添加或更改任何内容。也许 App_2 想在 App_1 的视图中将“hello world”放入这个指定区域。实现这一目标的最佳方法是什么?

信号会自然而然地浮现在脑海中。但是信号接收器应该发回什么?在我看来,App_1 模板包含一个自定义标签,它发送一个信号并接收一个模板列表(例如'app_2/template.html'),它会注册每个模板。但是,inclusion_tag 似乎只支持每个标签的 1 个模板渲染。

我有什么追索权?

【问题讨论】:

    标签: django templates dynamic


    【解决方案1】:

    我最终做了我所描述的,但没有默认的包含标签支持。我制作了一个自定义标签,用于发送信号、收集模板名称,并创建了一个节点,它按顺序呈现每个模板并连接结果。这似乎工作正常,并且与包含标签 shebang 具有相同的逻辑。

    【讨论】:

      【解决方案2】:

      我希望我的理解是正确的,但您对这个问题的解决方案似乎在您的第二句话中:“聚合”。 App_1 中的视图函数 应该聚合或收集所有必要的数据,然后通过上下文变量将其传递给模板。

      我认为需要解决的问题是:视图函数如何知道哪些数据要聚合?

      通常情况下,视图函数会提前编码,并知道它需要使用哪些数据。例如,日历应用程序可能被硬编码以获取事件模型对象并将它们传递给模板(通过上下文)。但是,在您的情况下,进入 App_1 的数据似乎是完全任意的,并且之前没有定义。

      您提到了信号,但我认为您将在这里遇到的问题是信号仅给出事件发生的通知。它们不允许 reeveing 函数传回数据,发出信号的代码也不会等待所有信号接收器完成处理才能继续。

      也许你可以建立一个注册系统。 App_1 维护着一个something 的列表。其他应用程序将项目“注册”到该列表,当 App_1 中的视图函数触发时,它会将列表转换为可用数据,然后通过上下文变量将其传递给模板。

      【讨论】:

      • 啊,但信号确实有返回值 :) 这些“从侦听器中提取”功能非常方便。无论如何,我还是编写了一个多模板包含标签,因为渲染其他模板的逻辑不应该驻留在视图中(这是我最初所做的)。
      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 2011-06-02
      • 2013-10-01
      • 2013-12-16
      • 2016-02-10
      • 2016-04-13
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多