python - dict - django templates examples
Plantilla Django cómo buscar un valor de diccionario con una variable (5)
Escribir un filtro de plantilla personalizado:
from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
(Yo uso .get
para que si la clave está ausente, no devuelve ninguno. Si haces dictionary[key]
se generará un KeyError
).
uso:
{{ mydict|get_item:item.NAME }}
mydict = {"key1":"value1", "key2":"value2"}
La forma habitual de buscar un valor de diccionario en una plantilla de Django es {{ mydict.key1 }}
, {{ mydict.key2 }}
. ¿Qué pasa si la clave es una variable de bucle? es decir:
{% for item in list %} # where item has an attribute NAME
{{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}
mydict.item.NAME
falla. ¿Cómo arreglar esto?
No puedes por defecto. El punto es el separador / disparador para la búsqueda de atributos / búsqueda de claves / división.
Los puntos tienen un significado especial en la representación de la plantilla. Un punto en un nombre de variable significa una búsqueda. Específicamente, cuando el sistema de plantilla encuentra un punto en un nombre de variable, intenta las siguientes búsquedas, en este orden:
- Búsqueda de diccionario. Ejemplo: foo ["barra"]
- Búsqueda de atributos. Ejemplo: foo.bar
- Búsqueda de índice de lista. Ejemplo: foo [bar]
Pero puedes hacer un filtro que te permita pasar un argumento:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
@register.filter(name=''lookup'')
def lookup(value, arg):
return value[arg]
{{ mydict|lookup:item.name }}
Obtenga la clave y el valor del diccionario en el ciclo:
{% for key, value in mydict.items %}
{{ value }}
{% endfor %}
Encuentro esto más fácil de leer y evita la necesidad de una codificación especial. Por lo general, necesito la clave y el valor dentro del lazo de todos modos.
Para mí, la creación de un archivo python llamado template_filters.py
en mi aplicación con el siguiente contenido hizo el trabajo
# coding=utf-8
from django.template.base import Library
register = Library()
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
el uso es como lo que dijo Culebrón:
{{ mydict|get_item:item.NAME }}
Tuve una situación similar. Sin embargo, utilicé una solución diferente.
En mi modelo, creo una propiedad que hace la búsqueda del diccionario. En la plantilla, uso la propiedad.
En mi modelo: -
@property
def state_(self):
""" Return the text of the state rather than an integer """
return self.STATE[self.state]
En mi plantilla: -
The state is: {{ item.state_ }}