在Django中进行条件格式化的正确方法是什么?
我有一个包含日期字段的模型,我想显示一个记录列表,但是根据该日期字段的值为行着色。例如,今天我想要成为黄色的记录,今天之前我想要绿色的记录和我想要红色之后的记录。
在Django的某个地方,您需要进行比较,将当前日期与记录中的日期进行比较。
我可以看到可以进行比较的三个不同的地方:
这些方法中哪一个是正确的Django方式呢?听起来像条件格式化会经常出现,并且因为你不能在模板中进行任意比较,所以需要一些其他的解决方案。
同样适用于更简单的格式规则,例如,如果我想显示学生成绩列表,我想让那些高于80%绿色和低于30%红色的那些。
答案 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。