django - 模板中的列表列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django - 模板中的列表列表相关的知识,希望对你有一定的参考价值。

我试图渲染一个用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='')

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

答案

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

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

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

{% endfor %}

How to render a context

另一答案

我想你应该看看django-multiforloop

另一答案

您也可以根据类型处理模板中的列表元素(使用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>

以上是关于django - 模板中的列表列表的主要内容,如果未能解决你的问题,请参考以下文章

Django:遍历模板中的过滤列表

django - 模板中的列表列表

有没有办法在 django 模板中迭代列表中的列表?

Django - 检查列表是不是包含模板中的某些内容

如何根据 django 模板中的日期过滤列表

Django模板 - 查找列表中的至少一项是不是出现在其他列表中