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'] }}
请注意,因为您的词典 属性 名称中确实有西班牙口音,您可能必须使用方括号表示法 [ ]
才能访问那些 属性也是。
我对开发知之甚少,我花了好几天时间寻找解决方案,进行了测试,但什么也没做。
我在 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'] }}
请注意,因为您的词典 属性 名称中确实有西班牙口音,您可能必须使用方括号表示法 [ ]
才能访问那些 属性也是。