【问题标题】:Django/Jinja2: How to use the index value in a for-loop statement to display two lists?Django/Jinja2:如何在for循环语句中使用索引值来显示两个列表?
【发布时间】:2018-03-13 00:57:33
【问题描述】:

我正在尝试显示两个列表中的项目。这是我的代码:

#Django view.py file
def display(request):
   listone = ['duck', 'chicken', 'cat', 'dog']
   lents = len(list_one)
   listtwo = ['4 dollars', '3 dollars', '2 dollars', '1 dollars']
   return render(request, 'display.html', {'itemone' : listone, 'itemtwo' : listtwo, 'lents' : lents})

这是显示列表的 display.html 模板:

<table>
   <tr>
     <th>Pet</th>
     <th>Price</th> 
   </tr>
   {% for numbers in lents %}
      <tr>
        <td>{{ itemone.numbers }}</td>
        <td>{{ itemtwo.numbers }}</td>
      </tr>
   {% endfor %}
</table>

但如果没有运气,它不会根据索引“数字”显示结果,该索引假定从“0”到“3”,td 标记保持为空。

【问题讨论】:

  • 我对此并不积极,但我认为 Jinja 不知道 lents 是什么,因为您没有将其传递给模板,而只是发送了一个字典。也许尝试存储您传递的 dict 变量,然后将该变量传递给模板。

标签: python django jinja2


【解决方案1】:

更好的选择是在您的视图中创建一个zip 对象,将宠物与价格匹配,然后仅将其传递给模板:

def display(request):
   listone = ['duck', 'chicken', 'cat', 'dog']
   listtwo = ['4 dollars', '3 dollars', '2 dollars', '1 dollars']
   fusion = zip(listone, listtwo)
   return render(request, 'display.html', {'fusion' : fusion})

然后你可以在你的模板中解压它,zip() 会产生一个元组列表(name, price),你可以很容易地循环:

<table>
   <tr>
     <th>Pet</th>
     <th>Price</th>
   </tr>
   {% for name, price in fusion %}
      <tr>
        <td>{{ name }}</td>
        <td>{{ price }}</td>
      </tr>
   {% endfor %}
</table>

另一个解决方案是创建一个新的自定义template filter,已经有一些帖子解释了这个过程:https://stackoverflow.com/a/29664945/6655211

【讨论】:

  • 我认为您使用 'zip( )' 函数的方式在创建自定义模板过滤器时更省力,这也是在列表中显示项目的另一种好方法。非常感谢,它真的帮了我很多。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2020-05-09
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多