Django在模板中的for循环中打印第一个匹配值

时间:2015-01-15 20:09:16

标签: python django django-templates

我有3个模型,它们被外键引用,我需要使用一些过滤器显示所有OrderDetails数据的报告。

我还需要包括OrderEntry的日期和Inventory条目的日期。但是当我尝试渲染3个查询集时,日期重复(n)次。

如何限制只打印循环中的第一个或最后一个匹配?

models.py

class OEntradaDetalle(models.Model):
    oentrada = models.ForeignKey(OEntrada, related_name='orden')
    ...


class RecepcionOEntrada(models.Model):
    oentradadetalle = models.ForeignKey(OEntradaDetalle, related_name='recepciones')
    folio = models.CharField(max_length=20)
    fecha = models.DateTimeField(auto_now_add=True)
    ...

class InventarioEntrada(models.Model):
    cantidad = models.DecimalField(default=0, decimal_places=2, max_digits=10)
    epc = models.CharField(max_length=25, null=True, blank=True)
    fecha = models.DateTimeField(auto_now_add=True)
    oentrada = models.ForeignKey('OEntrada', blank=True, null=True)
    ...

views.py

        detalles = OEntradaDetalle.objects.filter(oentrada=oentrada)
        recibidos = RecepcionOEntrada.objects.filter(oentradadetalle__in=detalles)
        inventario = InventarioEntrada.objects.filter(oentrada=oentrada)
        return render(request, 'reporteOEFolio.html', locals())

模板reporteOEFolio.html

{% for d in detalles %}
        <tr>
          <td>{{ d.epc }}</td>
          ...
          <td>{% for r in recibidos %}{% if r.oentradadetalle == d %}}{{ r.fecha|date:"SHORT_DATE_FORMAT" }}{% endif %}{% endfor %}</td>
          <td>{% for r in recibidos %}{% if r.oentradadetalle == d %}{{ r.fecha|time:"H:i:s" }}{% endif %}{% endfor %}</td>
          <td>{% for r in recibidos %}{% if r.oentradadetalle == d %}{{ r.folio }}{% endif %}{% endfor %}</td>
          <td>{% for i in inventario %}{% if i.epc == d.epc %}{{ i.fecha|date:"SHORT_DATE_FORMAT" }}{% endif %}{% endfor %}</td>
          <td>{% for i in inventario %}{% if i.epc == d.epc %}{{ i.fecha|time:"H:i:s" }}{% endif %}{% endfor %}</td>
        </tr>
    {% empty %}

我实际上要做的是首先打印OEntradaDetalle对象的数据,然后使用for循环我正在寻找匹配然后打印该值。但是如果该值在查询集中多次,则会打印多次匹配。

有没有办法只打印第一场比赛?比如break

有没有办法只打印最后一场比赛?喜欢覆盖价值?

可能但不重复: django print loop value only oncedjango print only one value in for loop in template

1 个答案:

答案 0 :(得分:0)

这个问题有几种可能的答案。最简单的是,您可以在查询集中引用单个项目:

qset[0]

如果您的查询集返回多个相同的值,则可以将其压缩:

qset.distinct()

最后,如果你想迭代&#34;很多&#34;关系的一面,但参考一个&#34;一个&#34;您可以使用templatetag重新组合效果良好:https://docs.djangoproject.com/en/1.7/ref/templates/builtins/#regroup