循环Django模板中的多个列表

时间:2015-08-12 23:02:10

标签: python django templates django-templates

我有一个django模板,我想在我的视图中显示一堆html表。我传入一个列表,其中列表中的每个元素都是一个html表。我也想标记表格,但我无法弄清楚如何正确地遍历html表格列表和标签列表。

在views.py中,我从简单的数据帧创建html表:

##task_dict is a dictionary where the values are lists of dataframes.
keys = task_dict.keys()
html_dict = dict.fromkeys(keys,[])

for key in keys:
    for df in task_dict[key]:
        temp_html = df.to_html(classes="table table-hover")
        html_dict[key].append('<br>')
        html_dict[key].append(temp_html)

labels = ['New Plan','New Operation','Current Operation']
html_dict['labels'] = labels

return render(request,'InterfaceApp/SchedulerIngestResults.html',html_dict)

我的html模板目前看起来像这样:

 <div class="panel panel-body">
    {% for df in key1 %}
      {% for l in labels %}
        <div class="panel-heading">{{ l }}
          <div class="table-responsive">
            {{ df | safe }}
          </div>
        </div>
      {% endfor %}
    {% endfor %}
  </div>

我知道这不对,但我无法弄清楚如何正确地做到这一点。我想要的只是它看起来像这样:

表格标签1

表1

表格标签2

表2

1 个答案:

答案 0 :(得分:4)

因为如果不从头开始创建一个django应用程序,这是一种很难解决的问题,我将会大声思考。

首先,让我们看看你的模板。

 <div class="panel panel-body">
    {% for df in key1 %}
      {% for l in labels %}
        <div class="panel-heading">{{ l }}
          <div class="table-responsive">
            {{ df | safe }}
          </div>
        </div>
      {% endfor %}
    {% endfor %}
</div>

现在,让我们将key1labels设置为简单的内容。怎么样......

key1 = {'df1' : df1TableHTML, 'df2' : df2TableHTML}
labels = ['label1', 'label2']

现在,让我们看看你们for-loops将如何构建html。

<div class="panel panel-body">

  <div class="panel-heading"> label1
    <div class="table-responsive">
      df1TableHTML
    </div>
  </div>

  <div class="panel-heading"> label2
    <div class="table-responsive">
      df1TableHTML
    </div>
  </div>

  <div class="panel-heading"> label1
    <div class="table-responsive">
      df2TableHTML
    </div>
  </div>

  <div class="panel-heading"> label2
    <div class="table-responsive">
      df2TableHTML
    </div>
  </div>

</div>

我确信此时您可以看到问题出在哪里。由于您使用的是嵌套的for循环,因此最终会得到比您最初想要的更多的输出。要解决此问题,您需要同时迭代key1labels

这样做的pythonic方法是使用zip()命令。

>>> a = ['a','b','c']
>>> b = ['A','B','C']
>>> for x in zip(a,b):
...     print x
... 
('a', 'A')
('b', 'B')
('c', 'C')

然而,Django没有模板标签的zip等价物。这意味着您必须在views.py中执行“压缩”服务器端。做类似下面的事情。

...
labels = ['New Plan','New Operation','Current Operation']
html_dict['labels_tables'] = zip(label, list_of_tables)

然后在你的模板中,执行此操作。

<div class="panel panel-body">
  {% for lt in label_table %}
    <div class="panel-heading">{{ lt.0 }}
      <div class="table-responsive">
        {{ lt.1 | safe }}
      </div>
    </div>
  {% endfor %}
</div>

希望这能回答你的问题,并且对于冗长的答案感到抱歉。 让我知道这是否有效,如果这不是你想要的,我很乐意给你进一步的帮助。