我有一个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
答案 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>
现在,让我们将key1
和labels
设置为简单的内容。怎么样......
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循环,因此最终会得到比您最初想要的更多的输出。要解决此问题,您需要同时迭代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>
希望这能回答你的问题,并且对于冗长的答案感到抱歉。 让我知道这是否有效,如果这不是你想要的,我很乐意给你进一步的帮助。