Django 条件格式化的方法
在Django中,如何正确地进行条件格式化?
我有一个模型,其中有一个日期字段。我想展示一份记录列表,但根据这个日期字段的值来给行上色。比如,今天的记录我想标成黄色,今天之前的记录我想标成绿色,今天之后的记录我想标成红色。
在Django的某个地方,你需要进行这样的比较,也就是把当前日期和记录中的日期进行对比。
我能想到三种不同的地方可以进行这个比较:
- 在我的模型中添加一个方法,比如叫做status(),这个方法返回'过去'、'现在'或'未来',然后在模板中用这个方法来给行上色。
- 在视图中,不直接把查询结果返回给模板,而是先处理一下列表,比较每一条记录,构建一个新的字典,里面包含'过去'、'现在'和'未来'的值,然后在模板中使用这个字典。
- 创建一个新的模板标签来进行比较。
这三种方法中,哪一种是Django的正确做法呢?听起来条件格式化是一个经常会遇到的需求,而且由于在模板中不能随意比较,所以需要其他的解决方案。
同样的道理也适用于更简单的格式化规则,比如,如果我想展示一份学生成绩的列表,想把高于80%的标成绿色,低于30%的标成红色。
4 个回答
2
因为你是在做静态比较(不需要查询),所以应该选择最简单、最干净的实现方式。在这种情况下,我建议你选择第4种方法,制作一个模板过滤器。这样你就可以用 value|filter 的方式来获取你需要设置背景颜色的类。其实,模板过滤器的实现比模板标签要简单一些。
4
我有过类似的需求;因为这和业务逻辑关系很大,所以我在模型里添加了一个方法来管理这些信息,然后在模板中使用它:
{% if not bug.within_due_date %}bgcolor="OrangeRed"{% endif %}
当然,也可以通过模板标签或过滤器来获取这些信息;但在我的情况下,我觉得把逻辑放在模型里是最合适的。我建议你也可以这样分析一下。
8
我非常喜欢把所有的“业务”逻辑放在视图函数里,把所有的展示内容放在模板和CSS里。
第一种选项是最理想的。你返回一个包含日期和状态的列表,状态是一个类名(比如“过去”、“现在”、“未来”)。
然后你的模板会根据状态信息来给一个<span>
标签设置类名。你的CSS则负责为这个标签提供颜色编码。
这样一来,你就可以自由地更改规则,而不会影响到模板。你可以修改CSS,而不需要动HTML或Python代码。
{% for date,state in the_date_list %}
<span class="{{state}}">date</span>
{% endfor %}