在Django模板中的Rowspan和分组

时间:2015-02-06 08:22:33

标签: python html django django-templates html-table

我在查询集中有很多行。许多行在两个字段中共享相同的值。

我想在表格中显示整个查询集,但我不想打印多次相同的值。

我的输出类似于

  mood, age, id
=============
  glad,  31, 1
      ,    , 2
      ,    , 3
      ,  32, 4
      ,    , 5
   sad,  31, 6
      ,    , 7
      ,  34, 8
      ,    , 9
      ,    , 10
 happy,  40, 11

我希望这是有道理的。当多行共享相同的值时,我不想再次打印它们。我正在使用rowspan属性使行填充共享相同值的行数。

我知道如何只使用一个字段:

{% regroup my_queryset by mood as mood_list %}
{% for mood in mood_list %}
    {% for node in mood.list %}
        <tr>
            {% if forloop.first %}
                <td rowspan="{{ mood.list|length }}">{{ mood.grouper }}</td>
            {% endif %}
            <td>{{ node.id }}</td>
        </tr>
    {% endfor %}
{% endfor %}

但我不知道如何在心情和年龄“填充多行”时完成相同的操作。我想必须有一些好方法,因为我看到其他网站在许多领域都做同样的事情(例如商业智能工具)。

1 个答案:

答案 0 :(得分:1)

使用here中的示例和here中的parentloop提示,我创建了以下代码:

{% if my_queryset %}
    {% regroup my_queryset by mood as data_by_mood %}
    <table border="1">
        <thead>
            <caption>Data</caption>
            <tr><th>mood</th><th>age</th><th>id</th></tr>
        </thead>
        <tbody>
            {% for data0 in data_by_mood %}
                {% regroup data0.list by age as data0_by_age %}
                {% for data1 in data0_by_age %}
                    {% for data in data1.list %}
                        <tr>
                            {% if forloop.first %}
                                {% if forloop.parentloop.first %}
                                    <td rowspan="{{ data0.list|length }}">{{ data0.grouper }}</td>
                                {% endif %}
                                <td rowspan="{{ data1.list|length }}">{{ data1.grouper }}</td>
                            {% endif %}
                            <td>{{ data.id }}</td>
                        </tr>
                    {% endfor %}
                {% endfor %}
            {% endfor %}
        </tbody>
    </table>
{% endif %}

我希望它有所帮助(它对我来说也是一个类似的问题)。