Django方式做条件格式化

时间:2009-07-01 11:21:31

标签: python django formatting django-templates

在Django中进行条件格式化的正确方法是什么?

我有一个包含日期字段的模型,我想显示一个记录列表,但是根据该日期字段的值为行着色。例如,今天我想要成为黄色的记录,今天之前我想要绿色的记录和我想要红色之后的记录。

在Django的某个地方,您需要进行比较,将当前日期与记录中的日期进行比较。

我可以看到可以进行比较的三个不同的地方:

  1. 向我的模型添加一个方法,例如status(),它返回'过去','现在','未来',然后在模板中使用该方法为行着色。
  2. 在视图中,不是将查询集返回给模板,而是预处理列表并比较每条记录,构建一个新的dict,其中包含要在模板中使用的“过去”,“当前”和“未来”值< / LI>
  3. 创建一个用于进行比较的新模板标记。
  4. 这些方法中哪一个是正确的Django方式呢?听起来像条件​​格式化会经常出现,并且因为你不能在模板中进行任意比较,所以需要一些其他的解决方案。

    同样适用于更简单的格式规则,例如,如果我想显示学生成绩列表,我想让那些高于80%绿色和低于30%红色的那些。

4 个答案:

答案 0 :(得分:8)

我非常喜欢将所有“业务”逻辑放在视图函数和模板/ CSS中的所有表示中。

选项1是理想的选择。您返回一对配对列表:(日期,州),其中州是类名(“过去”,“现在”,“未来”)。

然后,您的模板将状态信息用作<span>的类。然后,您的CSS会为该范围提供颜色编码。

您现在可以自由更改规则而不会破坏模板。您可以在不触及HTML或Python代码的情况下更改CSS。

{% for date,state in the_date_list %}
    <span class="{{state}}">date</span>
{% endfor %}

答案 1 :(得分:4)

我有一个非常相似的要求;因为这与业务逻辑非常相关,所以我添加了一种模型方法来管理这种信息,然后在模板中使用:

{% if not bug.within_due_date %}bgcolor="OrangeRed"{% endif %}

也可以通过模板标签或过滤器获得;但就我而言,我认为逻辑的最佳位置在模型中;我建议你以同样的方式分析它。

答案 2 :(得分:2)

由于您正在进行静态比较(不需要查询),因此您应该选择最干燥且易于实现的选项。在这种情况下,我会选择选项4,制作模板过滤器。然后你可以进行值|过滤以获得设置背景颜色所需的类。模板过滤器实际上比模板标签要简单一些。

答案 3 :(得分:0)

您还可以查看Django对内置格式和过滤标记的参考。它肯定有你想要的东西和更多,这是一个很好的链接书签。

您可以查看here