我有一个 django 项目 pro1,其中有几个应用程序:应用程序1、应用程序2、应用程序3 等等。我想显示一些顶级模板,其中包含每个应用程序的块:

example_base_template.html:

[header /]
[left nav bar]{{ app1 rendered template }}[/left nav bar]
[right nav bar]{{ app2 rendered template }}[/right nav bar]
[center section]{{ app1 main functionality template }}[/center section]
[footer]{{ app3 rendered template }}{{ app4 rendered template }}[/footer]

所有这些应用程序模板都是动态的,使用数据库。如何以最恰当、最优雅的方式做到这一点?或者也许问题是如何将 4 个不同的视图连接到一个 URL?

有帮助吗?

解决方案

我们遇到了与此类似的问题,关键是将正确的数据放入上下文中。我们所做的是将每个视图的数据创建/上下文填充分解为单独的构建上下文例程。原始视图只是调用各自的例程,然后渲染它们的模板。复合视图调用每个上下文构建器,然后呈现主模板,然后主模板包含子模板。

这就是我们在 Django 模板系统中遇到的一些问题。我们正在缓存模板片段,其中一些片段获取的数据生成起来非常昂贵。如果片段不是陈旧的,我们绝对不想做这项工作。但是推迟工作直到我们知道我们需要它意味着我们现在处于模板中并且:

  • 您无法将参数传递给模板内的方法。
  • django.template.__init__.Variable._resolve_lookup() 方法被破坏了,因为如果你传递了一个可调用的,它就不会调用它!如果您在上下文中引用对象的方法,那么效果就很好。

需要可调用函数才能工作的原因是它允许您传入柯里化函数——即已指定部分(或全部)参数的函数,但是 尚未被调用。 因此视图(或案例中的上下文构建)应该能够柯里化一个完整指定的函数(记住,你不能在模板本身中传递参数),以便模板 当需要时 可以调用可调用对象,获取数据,然后就可以开始了。

我们对此采取了两种不同的方法:

自从我们创建这个网站以来,我了解到我们可能可以通过使用生成器作为延迟数据生成器来解决这个问题。生成器的行为有点像柯里化函数(因为您可以为设置传递任意参数),但模板引擎将它们视为另一个迭代器。有一个 很棒的教程 关于这个话题。笔记:生成器不是数组,您只能使用它们一次,因此您的一些逻辑可能需要调整。

下次我想我们就一起去 jinja2 模板 并停止使用 Django 的模板。

其他提示

您可以使用 {%include%} 标签。但它对你没有多大帮助。更好的解决方案是编写自定义的包含标记具有所需的模板和功能。

你不能(以简单的方式)将几个视图合并为一个。尝试标记其漂亮的django解决方案。

我是通过为我想要包含的每个应用程序编写自定义模板标记来实现的。起初我的模板标签刚刚传回硬编码的html。后来我发现标签可以加载自己的模板片段。在某个地方还有一个片段,它是一个非常好的通用最新内容标签。

许多可重复使用的应用程序(尤其是那些被选入 Pinax 项目的应用程序)可以作为如何使用自定义的很好的示例用于插入内容的模板标记。 James Bennett在DjangoCon 2008中的讲话也可能有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top