【问题标题】:Django 1.10 Templates - Print two python lists next to eachother in HTML TemplateDjango 1.10 模板 - 在 HTML 模板中打印两个相邻的 python 列表
【发布时间】:2018-08-21 09:09:31
【问题描述】:

我目前正在我的测试遗留数据库中查询所有值为 oee_hour 且不为空的对象,使用:

lines_hourly = Lineoeex.objects.all.values('oee_hour')
hourly_oee_list = list (Lineoeex.objects.all().values_list('oee_hour', flat=True).exclude(oee_hour=None)) #no null entries

在同一行中,我的数据库还包含一个 date_hour 列,也包含空值。

我正在使用以下方法查询所有值为 date_hour 的对象:

time_hourly = Lineoeex.objects.all.values('date_hour')
time_hourly_list = list (Lineoeex.objects.all().values_list('date_hour', flat=True).exclude(date_hour=None))

两个列表都匹配,1 个实值后跟 5 个空值

然后我将这些变量传递给我的模板。

我在我的 HTML 代码中迭代 hourly_oee_list 并打印每个值。

如何从 hourly_oee 旁边的 time_hourly_list 打印 date_hour 值?

打印 hourly_oee 的代码

<ul class="list-group">
    {% for hourlyoee in hourly_oee_list %}
        <li class="list-group-item> OEE: {{ hourlyoee }} </li>
    {% endfor %}
</ul>

这会打印出hourly_oee_list 中的所有oee_hour 值。我想在具有相同样式的 OEE 值旁边打印出 time_hourly_list 内的 date_hour 值。

嵌套 for 循环不会产生预期的效果。

关于如何实施的任何建议?谢谢

【问题讨论】:

  • 两个查询中的元素是否相同?
  • 为什么还要查询两个单独的列表?
  • @WillemVanOnsem 元素不同。一个包含实际 OEE 值,另一个包含读取时间。

标签: python django database sqlite


【解决方案1】:
hourly_oee_list = Lineoeex.objects.values('oee_hour', 'date_hour').exclude(date_hour=None, oee_hour=None)


<ul class="list-group">
    {% for hourlyoee in hourly_oee_list %}
        <li class="list-group-item> OEE: {{ hourlyoee.oee_hour }} </li>
        <li class="list-group-item> OEE: {{ hourlyoee.date_hour }} </li>
    {% endfor %}
</ul>

【讨论】:

    【解决方案2】:

    如果我理解正确,您可以将两个查询结合起来,这不仅提供了一个保证两个列表中的数据顺序相同,这也将提高效率:

    data = Lineoeex.objects.filter(
        oee_hour__isnull=False,
        date_hour__isnull=False,
    ).values_list('oee_hour', 'date_hour')

    data 在这里是一个包含 2 个元组的 QuerySet,然后我们可以遍历查询集并使用 sequence unpacking 来访问这些值:

    <ul class="list-group">
        {% for oeee, datehour in data %}
            <li class="list-group-item> OEE: {{ oeee}} - {{ datehour }} </li>
        {% endfor %}
    </ul>

    但是如果列数合理,并且解析结果不需要太多时间,通常更简单的是获取Lineoeex对象,并直接访问属性,例如:

    data = Lineoeex.objects.filter(
        oee_hour__isnull=False,
        date_hour__isnull=False,
    )

    在模板中:

    <ul class="list-group">
        {% for datum in data %}
            <li class="list-group-item> OEE: {{ datum.oee_hour}} - {{ datum.date_hour }} </li>
        {% endfor %}
    </ul>

    这使得您在 Lineoeex 对象中使用的属性更加明确:您无需检查视图中的 QuerySet,即可了解它如何与模板交互。

    【讨论】:

    • 谢谢,测试了第一种方法,效果很好。最后剩下的问题是如何操作变量 datehour 以便我可以编写例如 OEE 是从小时 10 到小时 11 的 80%。 {{datehour+1}} 等模板渲染将不起作用。在我之前的方法中,我曾经在views.py 中操作此变量,并将datehourdatehour+1 都传递给模板。可以从模板端做类似的事情吗?谢谢
    • @fcp: 带有模板过滤器,所以{{ datehour|add:"1" }} 将在结果中加一(假设它是一个数字,如果它是一个DateTime 或任何相关的,你应该在查看.
    猜你喜欢
    • 2017-02-11
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2017-08-19
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多