过滤和比较Django的年份

时间:2014-05-29 15:07:04

标签: python django web

我是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>

1 个答案:

答案 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月重新检查的话没有被标记为红色。