2

我正在尝试呈现用 .zip 压缩的列表列表zip()

list_of_list = zip(location,rating,images)

我想将此渲染list_of_list为模板,并且只想显示每个位置的第一张图像。

我的位置和图像模型是这些:

class Location(models.Model):
  locationname = models.CharField

class Image(models.Model):
  of_location = ForeignKey(Location,related_name="locs_image")
  img = models.ImageField(upload_to=".",default='')

这是压缩列表。如何仅访问模板中每个位置的第一张图片?

在此处输入图像描述

4

3 回答 3

5

将 传递list_of_lists给 RequestContext。images然后您可以在模板中引用列表的第一个索引:

{% for location, rating, images in list_of_lists %}

...
<img>{{ images.0 }}</img>
...

{% endfor %}

如何渲染上下文

于 2013-03-29T13:18:03.437 回答
1

我认为你应该看看 django-multiforloop

于 2013-03-29T13:21:43.120 回答
0

您还可以根据类型处理模板中的列表元素(使用 Django 1.11 )。

因此,如果您有您描述的视图:

# view.py
# ...
list_of_lists = zip(location,rating,images)
context['list_of_lists'] = list_of_lists
# ...

您需要做的就是创建一个标签来确定模板中元素的类型:

# tags.py
from django import template
register = template.Library()
@register.filter
def get_type(value):
    return type(value).__name__

然后您可以检测列表元素的内容类型,如果列表元素本身是列​​表,则仅显示第一个元素

{% load tags %}
{# ...other things #}
<thead>
  <tr>
    <th>locationname</th>
    <th>rating</th>
    <th>images</th>
  </tr>
</thead>
<tbody>
  <tr>
    {% for a_list in list_of_lists %}
    {% for an_el in a_list %}
    <td>
        {# if it is a list only take the first element #}
        {% if an_el|get_type == 'list' %}
        {{ an_el.0 }}
        {% else %}
        {{ an_el }}
        {% endif %}
    </td>
    {% endfor %}
  </tr>
  % endfor %}
</tbody>

于 2017-11-10T17:21:21.217 回答