Plantilla Django sobre cómo buscar un valor de diccionario con una variable.

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?

Escribe un filtro de plantilla personalizado:

 from django.template.defaulttags import register ... @register.filter def get_item(dictionary, key): return dictionary.get(key) 

(Utilizo .get modo que si la clave está ausente, no devuelve ninguna. Si hace un dictionary[key] , aparecerá un KeyError .)

uso:

 {{ mydict|get_item:item.NAME }} 

Obtenga tanto la clave como el valor del diccionario en el bucle:

 {% for key, value in mydict.items %} {{ value }} {% endfor %} 

Encuentro esto más fácil de leer y evita la necesidad de una encoding especial. Normalmente necesito la clave y el valor dentro del bucle de todos modos.

No puedes por defecto. El punto es el separador / activador para la búsqueda de atributos / búsqueda de claves / división.

Los puntos tienen un significado especial en la representación de plantillas. Un punto en el nombre de una variable significa una búsqueda. Específicamente, cuando el sistema de plantillas encuentra un punto en un nombre de variable, intenta las siguientes búsquedas, en este orden:

  • Búsqueda en el diccionario. Ejemplo: foo [“bar”]
  • Búsqueda de atributos. Ejemplo: foo.bar
  • Lista de búsqueda de índice. 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 }} 

Para mí, crear un archivo python llamado template_filters.py en mi aplicación con el contenido que se muestra a continuación 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 decía el 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 utilizo 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_ }} 

env: django 2.1.7

ver:

 dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag} return render(request, 'obj.html', {'dict_objs': dict_objs}) 

modelo:

 {% for obj_id,dict_obj in dict_objs.items %} {{ dict_obj.obj.obj_name }} {{ obj_id }} {{ forloop.counter }} {{ dict_obj.obj.update_timestamp|date:"Ymd H:i:s"}}