python - 遍历 Django 模板中的多个列表

标签 python django templates django-templates

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

现在,让我们为此设置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

执行此操作的 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/

相关文章:

python - 为什么 curve_fit 对于 beta 函数拟合不收敛?

python - Python os.pathsep 的 Rust 等价物是什么?

python - NLP - 查找相似/语音单词并计算段落中的分数

python - 在 Django 应用程序中使用 Python 对象

python - 为什么我需要在 Django 的 TestCase 中使用辅助方法 create_user() ?

python - Django 用户 julienb 没有要填充的配置文件

python - 无法从字典中获取值

c++ - 如何在模板函数或类中实例化包含类型的容器变量?

c++ - 模板特化编译器错误

c++ - 当用作非类型模板参数时,是否可以自动派生 std::array 的大小