据我所知,在Django中,模板语言是故意中断的,以防止在显示代码中进行过多的计算.这意味着,理想情况下,对于用户可能感到被迫进行计算的每种情况,都有一个更合适的替代方案.要么是诀窍的标记或过滤器,要么在视图中直截了当.任何不适合这里的烦恼都是罕见的.
但是我发现了一个相当令人讨厌的常见情况,并且Django有一个更好的方法可以做到这一点,我没有想到,或者他们应该在这里看到光线并在一个计算中移动一点点在不久的将来发布的模板(例如,他们使用if语句参数):
我有一个项目的查询集.我需要以某种方式显示它们,但我显示的内容不仅取决于对象的状态,还取决于其他独立的东西(通常是谁登录).因此,向模型添加功能将无济于事.
到目前为止,我一直在做的是将查询集转换为列表或树结构(取决于任务),并为每个查询集添加"view_extra"属性.view_extra是一个字典,我通常会依赖于依赖于登录等内容的值.除了麻烦之外,它还会破坏查询集的懒惰.我想我可以做一个发电机,但很明显这不是Django开发人员想要做的事情.
我应该更多地尝试查询集注释,但我不知道在一些更复杂的情况下它会有多好用.另外,在树或列表内列表结构场景中没有好处(具有成员的项目的查询集是我需要迭代的更多查询集).
我可以注册一个过滤器,(这里建议使用django模板系统,在模型中调用一个函数),但这是滥用过滤器,对吧?它们旨在转换文本和数据,而不是用于开发人员故意试图让我们不要做的事情的特定目的替代品.
我不知道的任何"正确"的方式吗?我是不是在这里建议这是Django的模板系统的缺陷吗?
小智 2
也许Jinja 模板将是在这种情况下使用 Django 模板系统的一个很好的替代方案。除了 Jinja 允许您在模板中使用某种级别的逻辑这一重要事实之外,Jinja 模板和 Django 模板几乎相同。
这个直接取自 Jinja 文档的示例代码看起来可能就是您想要实现的目标。
{% for comment in models.comments.latest(10) %}
...
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
要将 Jinja 与 Django 集成,您可以查看Coffin
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |