Jinja2 如何 return for 中的一场比赛

Jinja2 How to return one match in a for

我对开发知之甚少,我花了好几天时间寻找解决方案,进行了测试,但什么也没做。

我在 Home Assistant 中有一个休息传感器,它提供 JSON 我所在地区所有加油站的未分类数据,这是其中的一部分:

{
   "Fecha": "22/03/2022 12:10:11",
   "ListaEESSPrecio": [
      {
         "C.P.": "09003",
         "Dirección": "CL GENERAL SANZ PASTOR, S.N.",
         "Horario": "L-V: 08:00-16:00",
         "Latitud": "42,344667",
         "Localidad": "BURGOS",
         "Longitud (WGS84)": "-3,698667",
         "Margen": "D",
         "Municipio": "Burgos",
         "PrecioProducto": "1,789",
         "Provincia": "BURGOS",
         "Remisión": "OM",
         "Rótulo": "REPSOL",
         "Tipo Venta": "P",
         "IDEESS": "5989",
         "IDMunicipio": "1220",
         "IDProvincia": "09",
         "IDCCAA": "08"
      },
      {
         "C.P.": "09001",
         "Dirección": "LOPEZ BRAVO, 93",
         "Horario": "L-V: 06:30-22:00; S: 08:00-14:30",
         "Latitud": "42,362528",
         "Localidad": "BURGOS",
         "Longitud (WGS84)": "-3,762083",
         "Margen": "D",
         "Municipio": "Burgos",
         "PrecioProducto": "1,798",
         "Provincia": "BURGOS",
         "Remisión": "dm",
         "Rótulo": "VILLALÓN",
         "Tipo Venta": "P",
         "IDEESS": "9803",
         "IDMunicipio": "1220",
         "IDProvincia": "09",
         "IDCCAA": "08"
      },
      {
         "C.P.": "09001",
         "Dirección": "CALLE CONDADO DE TREVIÑO, 30",
         "Horario": "L-D: 06:00-00:00",
         "Latitud": "42,370528",
         "Localidad": "BURGOS",
         "Longitud (WGS84)": "-3,718528",
         "Margen": "I",
         "Municipio": "Burgos",
         "PrecioProducto": "1,792",
         "Provincia": "BURGOS",
         "Remisión": "dm",
         "Rótulo": "VILLALONQUEJAR",
         "Tipo Venta": "P",
         "IDEESS": "11878",
         "IDMunicipio": "1220",
         "IDProvincia": "09",
         "IDCCAA": "08"
      }]
}

然后在home assistant里面我有一张lovelace卡片,显示5个最便宜加油站的数据,代码是这样的:

- name: Gasolinera 1 nombre
  value_template: "{{ value_json['ListaEESSPrecio'][0]['Rótulo'] }}"
- name: Gasolinera 1 precio
  value_template: "{{ value_json['ListaEESSPrecio'][0]['PrecioProducto'] }}"
  unit_of_measurement: "€"
- name: Gasolinera 1 dirección
  value_template: "{{ value_json['ListaEESSPrecio'][0]['Dirección'] }}"

如您所见,我必须为每个加油站创建它的相关数据 JSON。

要对 JSON 进行排序,我对此进行了测试,有效:

{% for item in ListaEESSPrecio | sort(attribute='PrecioProducto') %}
    {{ item.Rótulo, item.PrecioProducto, item.Dirección }}
{%- endfor %}

这为我提供了所有 JSON 排序的数据,我也 select 编辑了我感兴趣的字段:

('REPSOL', '1,789', 'CL GENERAL SANZ PASTOR, S.N.')
('VILLALONQUEJAR', '1,792', 'CALLE CONDADO DE TREVIÑO, 30')
('VILLALÓN', '1,798', 'LOPEZ BRAVO, 93')

现在的问题是如何只访问所有字典或数组中的一项以将其放在 lovelace 卡上,其中我 select 每个传感器数据到 [=41= 上的数据]. gas_station1.price = 在 JSON 数据中第一个排序的加油站。

我测试过类似的东西,但没有成功。

{% for item in value_json['ListaEESSPrecio'][0] | sort(attribute='PrecioProducto') %}
    {% if loop.index == 1 %}
        {{ item.Rótulo, item.PrecioProducto, item.Dirección }}
    {% endif %}
{% endfor %}
{% for item in ListaEESSPrecio | sort(attribute='PrecioProducto') if item[0] <= t <= item[1]  %}
  {{ item[0] }}
{% endfor %}

上次试用报错:

UndefinedError: dict object has no element 0

如果您希望结果按 PrecioProducto 的值排序: 使用 sort(attribute=1.)

然后 json 这样:

>>> print(json.dumps(coffee, indent=4))
{
    "Fecha": "22/03/2022 12:10:11",
    "ListaEESSPrecio": [
        {
            "C.P.": "09003",
            "Direcci\u00f3n": "CL GENERAL SANZ PASTOR, S.N.",
            "Horario": "L-V: 08:00-16:00",
            "Latitud": "42,344667",
            "Localidad": "BURGOS",
            "Longitud (WGS84)": "-3,698667",
            "Margen": "D",
            "Municipio": "Burgos",
            "PrecioProducto": "1,789",
            "Provincia": "BURGOS",
            "Remisi\u00f3n": "OM",
            "R\u00f3tulo": "REPSOL",
            "Tipo Venta": "P",
            "IDEESS": "5989",
            "IDMunicipio": "1220",
            "IDProvincia": "09",
            "IDCCAA": "08"
        },
        {
            "C.P.": "09001",
            "Direcci\u00f3n": "LOPEZ BRAVO, 93",
            "Horario": "L-V: 06:30-22:00; S: 08:00-14:30",
            "Latitud": "42,362528",
            "Localidad": "BURGOS",
            "Longitud (WGS84)": "-3,762083",
            "Margen": "D",
            "Municipio": "Burgos",
            "PrecioProducto": "1,798",
            "Provincia": "BURGOS",
            "Remisi\u00f3n": "dm",
            "R\u00f3tulo": "VILLAL\u00d3N",
            "Tipo Venta": "P",
            "IDEESS": "9803",
            "IDMunicipio": "1220",
            "IDProvincia": "09",
            "IDCCAA": "08"
        },
        {
            "C.P.": "09001",
            "Direcci\u00f3n": "CALLE CONDADO DE TREVI\u00d1O, 30",
            "Horario": "L-D: 06:00-00:00",
            "Latitud": "42,370528",
            "Localidad": "BURGOS",
            "Longitud (WGS84)": "-3,718528",
            "Margen": "I",
            "Municipio": "Burgos",
            "PrecioProducto": "1,792",
            "Provincia": "BURGOS",
            "Remisi\u00f3n": "dm",
            "R\u00f3tulo": "VILLALONQUEJAR",
            "Tipo Venta": "P",
            "IDEESS": "11878",
            "IDMunicipio": "1220",
            "IDProvincia": "09",
            "IDCCAA": "08"
        }
    ]
}

您可能正在使用 flask 和 html jinja 模板,但这里使用 jinja2 模板:

>>> from  jinja2 import Template
>>> tm = Template("""
... 
... {% for item in ListaEESSPrecio | sort(attribute=1.PrecioProducto) %}
...     {{ item.Rótulo, item.PrecioProducto, item.Dirección }}
... {%- endfor %}
...
... """)
>>> 
>>> result = tm.render(ListaEESSPrecio=coffee.get('ListaEESSPrecio'))
>>>
>>> print(result)



    ('REPSOL', '1,789', 'CL GENERAL SANZ PASTOR, S.N.')
    ('VILLALÓN', '1,798', 'LOPEZ BRAVO, 93')
    ('VILLALONQUEJAR', '1,792', 'CALLE CONDADO DE TREVIÑO, 30')

>>>

您不需要循环来实现这一点,您可以在应用 sort 过滤器后使用 first 过滤器从列表中仅提取一项:

{% set item = ListaEESSPrecio | sort(attribute='PrecioProducto') | first %}
{{ item['Rótulo'], item['PrecioProducto'], item['Dirección'] }}

或者,使用方括号表示法 [ ] 访问列表的特定项目 — 请注意 Python 列表始终从索引 0 开始:

{% set item = (ListaEESSPrecio | sort(attribute='PrecioProducto'))[0] %}
{{ item['Rótulo'], item['PrecioProducto'], item['Dirección'] }}

请注意,因为您的词典 属性 名称中确实有西班牙口音,您可能必须使用方括号表示法 [ ] 才能访问那些 属性也是。