如何在Django中的模板级别访问同一for循环中的列表和字典

时间:2012-03-26 11:44:55

标签: python django django-templates django-views

我在view.py中有一个函数,它返回两个变量,即一个名为ca的字典和一个名为categories的列表:

def eventcateg_detail(request):
    ca = EventTypeCategory.objects.values()
    categories =[]
    for i in range(0, len(ca)):
       pk_sub = ca[i]['sub_categ_id']
       if (pk_sub!=None):
          category = EventTypeCategory.objects.get(id = pk_sub)
          category = category.name
          categories.append(category)
    return render(request,"events/categ.html",{
      'obj': ca,
      'categ' :categories
      })

categ返回:

[u'Critical in list', u'Information in list', u'Amit Pal in list']

我的categ.html是:

<thead>
        <tr><th>{% trans "Name Category" %}</th><th>{% trans " Message" %}</th><th>{% trans "Sub-categories" %}</th></tr>
    </thead>
    <tbody>
    {% for obj in obj %}
        <tr>

            <td>{{ obj.name }}</td><td> {{ obj.Message_slug }}</td><td></td>

        </tr>
    {% endfor %}
    </tbody>
</table>

我的输出应该是:

Event Category  Event Message   Sub-categories
Critical            critical    critical in list
Information         information information in list
Amit Pal            amit-pal    amit pal in list

子类别包含来自列表的数据。我正在使用Event Category(使用obj.name)和Event Message(使用obj.Message_slug),但是我无法找到任何方法将子类别也放在同一个td和循环相同(查看模板)。

1 个答案:

答案 0 :(得分:2)

我建议你看一下:Django, category and subcategories

这可能需要对您的模型进行一些更改,但会大大简化您的代码。

<强>更新

我将回答你的第一个问题:)

你可以在你的情况下嵌套for循环:

<thead>
    <tr><th>{% trans "Name Category" %}</th><th>{% trans " Message" %}</th><th>{% trans "Sub-categories" %}</th></tr>
</thead>
<tbody>
{% for obj in obj %}
    <tr>

        <td>{{ obj.name }}</td><td> {{ obj.Message_slug }}</td>
        <td>
            {% for i in categ %}
                  {{ i }}
            {% endfor %}
        </td>

    </tr>
{% endfor %}
</tbody>

然而!上面的代码指出了eventcateg_detail方法的一个弱点。您创建的列表不会告诉列表项属于哪个父类别,因此对于每个父对象,将打印所有项目。

如果你知道总会有一对一的关系,而且总会有一个孩子,你只能创建一个字典

另外,我相信您的初始代码可以简化:

def eventcateg_detail(request):
        ca = EventTypeCategory.objects.all()
        categories ={}
        for cat in ca:
            if cat.sub_categ_id:

               #Since the ca queryset already contains all items you can use that to get the child category
               category = ca.objects.get(id=cat.sub_categ_id)

               #Add to dictionary. NOTE: If you ever get more than one sub-category 
               #you need to build a list of sub-categories before adding it to the dict.
               categories[cat.id] = category.name
        return render(request,"events/categ.html",{ 'obj': ca, 'categ' :categories})

在模板中执行此操作:

<thead>
<tr>
     <th>{% trans "Name Category" %}</th>
     <th>{% trans " Message" %}</th><th>{% trans "Sub-categories" %}</th>
</tr>
</thead>
<tbody>
{% for o in obj %}
<tr>
    <td>{{ o.name }}</td><td> {{ o.Message_slug }}</td>
    <td>
        {% for key, value in categ.items %}
              {% ifequal key o.id %}
               {{ value }}
              {% endifequal %}
        {% endfor %}
    </td>

</tr>

{%endfor%}