【问题标题】:Looping over multiple lists in Django Template在 Django 模板中循环多个列表
【发布时间】:2015-11-05 17:58:22
【问题描述】:

我有一个 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

【问题讨论】:

  • 你的 views.py 有点难以理解。你说“我正在传递一个列表,其中列表中的每个元素都是一个 html 表。”但我看不出你在哪里做这个。我假设我只是一个 dingus 并且想念它。如果有这个列表,我下面的回答应该会对你有所帮助。

标签: python django templates django-templates


【解决方案1】:

由于在不从头开始创建 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 循环将如何构建 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

使用zip() 命令是一种pythonic 方式。

>>> 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>

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

【讨论】:

  • 修复了它!谢谢!
  • @Austin 你知道用 zip 中的 3 个项目做这件事的方法吗(如何将它迭代到模板中。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2019-05-06
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多