variable template ifequal examples bootstrap python django django-templates

python - template - django views



¿Accediendo a un dict por variable en las plantillas de Django? (4)

Mi código de vista se ve básicamente así:

context = Context() context[''my_dict''] = {''a'': 4, ''b'': 8, ''c'': 15, ''d'': 16, ''e'': 23, ''f'': 42 } context[''my_list''] = [''d'', ''f'', ''e'', ''b'', ''c'', ''a'']

Y lo que me gustaría hacer en mi plantilla de Django es esto:

<ul> {% for item in my_list %} <li>{{ item }} : {{ my_dict.item }}</li> {% endfor %} </ul>

Y me gustaría que esto de salida:

<ul> <li> d : 16 </li> <li> f : 42 </li> <li> e : 23 </li> <li> b : 8 </li> <li> c : 15 </li> <li> a : 4 </li> </ul>

Pero la referencia al dict por nombre de variable a través de {{ my_dict.item }} realidad no funciona. Sospecho que está haciendo internamente my_dict[''item''] lugar de my_dict[item] . ¿Hay alguna manera de evitar esto?


Aquí hay un caso de uso de la respuesta sugerida.

En este ejemplo, creé una plantilla genérica para generar datos tabulares desde una vista. Los metadatos sobre las columnas se mantienen en contexto ["columnMeta"].

Como se trata de un diccionario, no puedo confiar en las claves para generar las columnas en orden, así que tengo las claves en una lista separada para esto.

En mi vista.py:

c["columns"] = ["full_name","age"] c["columnMeta"] = {"age":{},"full_name":{"label":"name"}}

En mi archivo templatetags:

@register.filter def getitem ( item, string ): return item.get(string,'''')

En mi plantilla:

<tr> <!-- iterate columns in order specified --> {% for key in columns %} <th> <span class="column-title"> <!-- look label in meta dict. If not found, use the column key --> {{columnMeta|getitem:key|getitem:"label"|default:key}} </span> </th> {% endfor %}</tr>




Para mis necesidades, quería un filtro de una sola plantilla que funcionara para dicts, listas y tuplas. Entonces, esto es lo que yo uso:

@register.filter def get_item(container, key): if type(container) is dict: return container.get(key) elif type(container) in (list, tuple): return container[key] if len(container) > key else None return None