我是Django的新手所以请告诉我是否有比我尝试做的更好的方法论。
关于项目
我正在构建一个列出房屋和检查报告日期的应用程序。如果房屋未通过检查,则大约30天后再进行检查。
房屋详细信息(名称,地址)在一个模型中,检查报告(日期,违规)保存在另一个模型中。这是一个(房子)到很多(检查)的关系。
网页呈现方式如下:
HOUSE |TYPE |INSPECTION |VIOLATIONS
------------|----------|---------------|-----------:
Grand Place |Private | |
| |Nov. 21, 2011 |20
| |Dec. 20, 2011 |5
| |Oct. 20, 2012 |1
希望看到:
我想对检查区域进行颜色编码,这样如果那一年有多个检查,那么它是红色的,否则它是绿色的。这表明房子以前未通过检查。
额外的好处是在这些年之间也有一个分隔的边界,以提高可读性。
模板中的相关代码:
<div style="clear: both; font-size: .8em;">
{% if house_information_list %}
<table style="border: none; max-width: 600px;">
<th><tr style="border-bottom: 1px solid #333; font-weight: bold;">
<td>House</td>
<td>Type</td>
<td>Inspection</td>
<td>Violations</td>
<td>Inspection Report</td>
</tr></th>
{% for house in house_information_list %}
<tr>
<td>
<b>{{ house.house_name }}</b>
</td>
<td style="width: 120px;">
{{ house.house_type }}
</td>
<td style="width: 100px;"></td>
<td style="width: 80px;"></td>
<td style="width: 120px;"></td>
</tr>
{% for report in house.inspectionreport_set.all %}
<tr>
<td></td>
<td></td>
<td>
{{ report.inspection_date }}
</td>
<td style="text-align: right; padding-right: 20px;">
{{ report.inspection_violations }}
</td>
<td></td>
</tr>
{% endfor %}
{% endfor %}
</table>
{% else %}
<p>Uh oh!</p>
{% endif %}
</div>
答案 0 :(得分:1)
要完全按照您的描述进行操作,一种方法是在报告中使用regroup
模板标记,然后在year.list|length
块中检查if
。这也将支持多年之间的边界。
{% with house.inspectionreport_set.all as reports %}
{% regroup reports by inspection_date.year as years_list %}
{% for year in years_list %}
{# some year indicator #}
{% if year.list|length > 1 %}
{# red #}
{% else %}
{# green #}
{% endif %}
{% endfor %}
{% endwith %}
您可能需要使用自定义方法从检查日期开始计算年份,我不记得在regroup
字段中虚线查找是否有效。
或者,您可以在检查报告上存储成功/失败布尔值,并使用ifchanged
模板标记来执行年份边框。这可能就是我要做的事情,除非它真的打算在12月份的失败如果在明年1月重新检查的话没有被标记为红色。