mydict = {"key1":"value1", "key2":"value2"}
La forma más habitual de las operaciones de búsqueda de un valor del 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?
Obtenga tanto la clave como el valor del diccionario en el bucle:
Esto me resulta más fácil de leer y evita la necesidad de una codificación especial. Normalmente necesito la clave y el valor dentro del ciclo de todos modos.
fuente
No puedes por defecto. El punto es el separador / disparador para la búsqueda de atributos / búsqueda de claves / corte.
Pero puede hacer un filtro que le permita pasar un argumento:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
fuente
return value.get(arg)
porque eso no arrojaría una excepción KeyError si la clave no está presente.Para mí, la creación de un archivo de Python nombrado
template_filters.py
en mi aplicación con el contenido siguiente hizo el trabajoel uso es como lo que dijo culebrón:
fuente
register = Library()
? Qué hace ?django.template.base.Library
clase. alregister = Library()
instanciar esa clase y usar elfilter
anotador de funciones dentro de ella para satisfacer nuestras necesidadesTuve una situación similar. Sin embargo, usé una solución diferente.
En mi modelo, creo una propiedad que realiza la búsqueda del diccionario. En la plantilla, luego uso la propiedad.
En mi modelo: -
En mi plantilla: -
fuente
Como no puedo comentar, permítanme hacer esto en forma de una respuesta:
para construir sobre la respuesta de culebrón o la respuesta de Yuji 'Tomita' Tomita , el diccionario pasado a la función tiene la forma de una cadena, así que tal vez use ast. literal_eval para convertir la cadena a un diccionario primero, como en este ejemplo .
Con esta edición, el código debería verse así:
fuente
Medio ambiente: Django 2.2
Puse este código en un archivo llamado template_filters.py en mi carpeta de proyecto llamada portfoliomgr
No importa dónde coloque su código de filtro, asegúrese de tener __init__.py en esa carpeta
Agregue ese archivo a la sección de bibliotecas en la sección de plantillas en su archivo projectfolder / settings.py. Para mí, es portfoliomgr / settings.py
En su código html, cargue la biblioteca
fuente
env: django 2.1.7
ver:
modelo:
fuente
{{ dict_obj.obj.obj_name }}
es en este caso equivalente al código de Pythondict_obj["obj"]["obj_name"]
, sin embargo, la pregunta es sobre el equivalente dedict_obj[obj][obj_name]
.