[英]Looping over multiple lists in Django Template
我有一個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
如果不從頭開始創建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
。
一種執行此操作的Python方法是使用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>
希望這能回答您的問題,並為冗長的回答感到抱歉。 讓我知道這是否可行,如果這不是您想要的,很高興為您提供進一步的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.