我有一个 django 模板,我想显示在我的 View 中创建的一堆 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
表一
表格标签2
表2
最佳答案
由于如果不从头开始创建 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>
现在,让我们为此设置key1
和labels
一些简单的东西。怎么样...
key1 = {'df1' : df1TableHTML, 'df2' : df2TableHTML}
labels = ['label1', 'label2']
现在,让我们看看 for 循环将如何构建 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 循环,因此最终得到的输出比您最初想要的多得多。要解决此问题,您需要同时迭代 key1
和 labels
。
执行此操作的 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>
希望这能回答您的问题,对于冗长的回答,我们深表歉意。 让我知道这是否有效,如果这不是您想要的,我很乐意为您提供进一步的帮助。
关于python - 遍历 Django 模板中的多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31976842/