Django嵌套for循环:是否可以在第二个for循环的定义中使用第一个循环的结果?

时间:2013-07-29 18:28:23

标签: python django templates

在我的Django模板中,我试图在for循环中创建一个for循环。我试图使用其中一个字段的结果作为构造函数的第二个列表的名称。

我有两个对象成功传递给我的模板:

sectList = {"Id": 1, "Section": "Home", "Identifier": "homeList"}

homeList = {"Id": 1, "Title": "Home", "Url": "home/",
            "Id": 2, "Title": "My Account", "Url": "account/",
            "Id": 3, "Title": "Full List", "Url": "fullList/",}

在我的模板中,我有:

  <ul>
    {% for section in sectList %}
      {% autoescape off %}
        <li class="middle_table_li">
          <table class="middle_table">
            <tr>
              <td colspan="2" class="middle_table_cell">
                <a href="" class="middle_a_dark">
                  {{ section.Identifier }}
                </a>
              </td>
            </tr>
            <tr>
              {% for view in section.Identifier %}
                <div style="padding: 0px; margin: 0px; width: 100%;">
                  {{ view.title }}
                  <table style="text-align: left;">
                    <tr>
                      <td>
                        <a href="{{ view.url }}" class="left_a_light">{{ view.title }}</a>
                      </td>
                    </tr>
                  </table>
                </div>
              {% endfor %}
            </tr>
          </table>
        </li>
      {% endautoescape %}
    {% endfor %}
  </ul>

当我使用“ {%for section inIdentifier%} ”时, view.title 会返回“homeList”字样,每次迭代分割一个字符(h,o,m,e等)。当我尝试“ {%for {{section.Identifier}}}}}} 时,它会给我以下错误:

TemplateSyntaxError at /

Could not parse the remainder: '{{section.Identifier}}' from '{{section.Identifier}}'

我的问题是如何在for循环的构造函数中使用一个查询集的结果?在模板中,section.Identifier ='homeList',并且视图成功发送homeList数据,但不是使用视图中的homeList变量,而是将字符串拆分为列表,如list(“homeList”) ,结果是每一行都包含单词 homeList 中的单个字符。在常规的python代码中,我可以使用类似exec的东西来执行字符串作为代码,但我不确定如何在django模板中执行此操作,如果它甚至可能的话?

编辑#1(仅供参考,所有数据都成功传递给模板)

views.py

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.db import connection, transaction
from app_HomeView.models     import HomeList
from view_LeftPanel.models   import LeftPanelList

def HomeView(request):
    homeList = HomeList.objects.all().order_by("title")
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM view_leftpanelview_sectionlist ORDER BY Id;")
    desc = cursor.description
    sectList = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
    return render(request, "index.html", {"homeList": homeList,
                                          "sectList": sectList,})

2 个答案:

答案 0 :(得分:1)

我会说该集合应该更像

sectList = {"Id": 1, "Section": "Home",
"Identifier": {"Id": 1, "Title": "Home", 
"Url": "home/","Id": 2, "Title": "My Account",
 "Url": "account/","Id": 3, "Title": "Full List",
 "Url": "fullList/",}}

你看 - “标识符”:“homeList”实际上并不是你第二个列表的链接。它只是一个道具。名称和价值。

答案 1 :(得分:1)

你可以,但你的视图代码传递了错误的值,这就是为什么它不起作用。你有:

sectList = [{"Id": 1, "Section": "Home", "Identifier": "homeList"}]

然后在模板中,在第一个循环之后,section.Identifier的结果显然是"homeList",所以就像你运行一样:

for i in "homeList":
    print i

它将打印出“homeList”字符串的每个字符。

所以你需要做的是将homeList的列表嵌套在secList中,你的secList应该是这样的:

sectList = [{ 
    "Id": 1, "Section": "Home", "Identifier": [  # Identifier should be a list
        {"Id": 1, "Title": "Home", "Url": "home/"},
        {"Id": 2, "Title": "About", "Url": "about/"}
    ] 
}]

这是你的挑战,对吧?