4

我有一个 django 项目 pro1 有几个应用程序:app1、app2、app3 等等。我想显示一些包含每个应用程序块的顶级模板:

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?

4

4 回答 4

2

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

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

于 2008-11-12T18:32:30.287 回答
1

我通过为我想要包含的每个应用程序编写自定义模板标签来做到这一点。起初我的模板标签只是传回硬编码的 html。后来发现标签可以加载自己的模板片段。还有一个片段是一个通用的最新内容标签,效果很好。

于 2008-11-12T18:50:55.540 回答
0

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

这就是我们在使用 Django 模板系统时遇到一些问题的地方。我们正在缓存模板片段,其中一些片段获取了生成成本非常高的数据。如果片段不是陈旧的,我们肯定不想做这项工作。但是推迟工作直到我们知道我们需要它意味着我们现在在模板中并且:

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

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

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

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

下次我想我们将只使用jinja2 模板并停止使用 Django 的模板。

于 2008-11-12T18:40:11.567 回答
0

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

于 2009-01-02T12:59:57.730 回答