2011-03-23 49 views
5

我明白,在Django中,模板语言是故意中性的,以防止显示代码中的计算过多。这意味着,理想情况下,对于用户可能会被迫进行计算的每种情况,都有一个更合适的选择。无论是标签还是过滤器都可以实现,或者希望在视图中简单明了。任何不适合的烦恼都很少见。由于Django不鼓励将参数传递给模板中的函数,因此鼓励什么呢?

但是我发现了一个相当烦人的常见情况,Django有更好的方法来做到这一点,我没有想到,或者他们应该看到这里的光线,并将线条移动一点点在不久的将来版本中的模板内计算(例如,如果他们使用if语句参数):

我有一个项目的查询集。我需要以某种方式显示它们,但是我显示的内容不仅取决于对象的状态,还取决于其他独立的事物(通常是登录的人)。因此,向该模型添加一个函数将无济于事。

到目前为止,我一直在做的是将查询集转换为列表或树结构(取决于任务),并为每个查询添加一个“view_extra”属性。 view_extra是一个字典,我通常坚持取决于谁登录的东西。除了一个麻烦之外,它也破坏了查询集的懒惰。我想我可以去做一个生成器,但显然这并不是Django开发人员想到的。

我应该更多地尝试queryset注释,但我不知道如何在一些更复杂的情况下工作。另外,在树或list-list-list结构场景(包含成员的项目的查询集是我需要迭代的更多查询集)中没有用。

我可以注册一个过滤器(如这里建议的django template system, calling a function inside a model),但这是滥用过滤器,对吧?它们旨在改变文本和数据,而不是为了开发人员故意让我们不要做的事情的特定目的替代品。

任何“正确”的方式来做到这一点,我不知道?我是否建议这是Django模板系统的缺陷?

回答

2

也许Jinja templates是在这种情况下使用Django的模板系统的一个很好的选择。除了Jinja允许您在模板中使用某种级别的逻辑的重要事实之外,Jinja模板和Django模板几乎完全相同。

这个直接来自Jinja文档的示例代码看起来可能是您尝试实现的一种东西。

{% for comment in models.comments.latest(10) %} 
    ... 
{% endfor %} 

要神社Django的整合,你可以看看Coffin

4

我不明白为什么创建一个自定义标签和过滤器是一种“虐待”。就我而言,这正是他们的目标,我一直在使用它们。

+0

+1我同意。我刚刚开始使用Django模板进行一个侧面项目(我使用Mako作为我的主项目),虽然在某些情况下我觉得它很麻烦,但注册标签并不是那么困难。您正在将逻辑移入“代码”区域,并将其从显示逻辑中移除。 – 2011-03-23 08:44:14

+0

但是在那一点上,他们为什么不让你传递参数给任何成员函数呢?他们只是让它更加麻烦,以防止我们做得太多? – orblivion 2011-03-23 14:16:09

+1

我不会称之为滥用,但我同意@orblivion在这一个。创建一个自定义标签或过滤器可能是对这个问题的推荐答案,但大多数情况下它只是引入不需要的间接。你的模板仍然有一个方法调用,它仍然传递一个参数。唯一的区别是你不得不写一个中间人。 – poswald 2011-05-26 16:13:30