簡體   English   中英

在Django模板中循環多個列表

[英]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>

現在,讓我們將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

一種執行此操作的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM