python - template - linebreaksbr django
¿Cómo renderizar un diccionario ordenado en plantillas django? (4)
Estoy tratando de aprender las plantillas de django, pero no es fácil.
Tengo un cierto views.py que contiene un diccionario para ser renderizado con una plantilla. El diccionario está compuesto de pares clave-valor, donde la clave son nombres únicos y los valores son algunos valores asociados a esos nombres. Represento el diccionario de la siguiente manera:
return render_to_response(''results.html'', {''data'': results_dict})
Ahora mi problema es que en mi plantilla necesito mostrar los nombres en orden alfabético (o ASCIIbético) con los valores familiares.
En realidad, en mi plantilla tengo:
<table>
{% for key, value in data.items %}
<tr>
<td> {{ key }}: </td> <td> {{ value }} </td>
</tr>
</table>
¿Cómo puedo renderizar los datos de manera ordenada? Muchas gracias.
Aunque es preferible cambiar el código en la vista, también puede usar la etiqueta de plantilla dictsort:
https://docs.djangoproject.com/es/1.9/ref/templates/builtins/#std:templatefilter-dictsort
<table>
{% for key, value in data.items|dictsort:"0.lower" %}
<tr>
<td> {{ key }}: </td> <td> {{ value }} </td>
</tr>
</table>
En views.py (Python2):
return render_to_response(''results.html'',
{''data'': sorted(results_dict.iteritems())})
O en views.py (Python3):
return render_to_response(''results.html'',
{''data'': sorted(results_dict.items())})
En archivo de plantilla:
{% for key, value in data.items() %}
<tr>
<td> {{ key }}: </td> <td> {{ value }} </td>
</tr>
{% endfor %}
Otra solución que funcionó muy bien para mí y creo que es más simple. Utiliza OrderedDict()
más información
En su archivo views.py
, agregue:
from collections import OrderedDict
def main(request):
ord_dict = OrderedDict()
ord_dict[''2015-06-20''] = {}
ord_dict[''2015-06-20''][''a''] = ''1''
ord_dict[''2015-06-20''][''b''] = ''2''
ord_dict[''2015-06-21''] = {}
ord_dict[''2015-06-21''][''a''] = ''10''
ord_dict[''2015-06-21''][''b''] = ''20''
return render(request, ''main.html'', {''context'': ord_dict})
Luego, en su plantilla, puede hacer:
<table>
{% for key, value in context.items %}
<tr>
<td>{{ key }}</td>
<td>{{ value.a }}</td>
<td>{{ value.b }} </td>
</tr>
{% endfor %}
</table>
Esto devolverá las claves del diccionario en el mismo orden en que fueron colocadas.
2015-06-20 1 2
2015-06-21 10 20
Refrescante pregunta anterior, pero fue algo en lo que pasé un tiempo como noobie de programación. Se expande la respuesta de Yuji Tomita.
Cómo ordenar el diccionario que se ve así:
{model_A_object: {key: value, ...},...}
por model_A_object.field.
Lo llené con for loop, y lo uso para almacenar algunos datos de agregación, etc. para queryset que paso a la plantilla.
Me las he arreglado para hacer esto (con Shubuntu desde la ayuda de #Django) por:
result = sorted(dictionary.iteritems(), key= lambda (k, v) : (k.field, v))
Luego en la plantilla:
{% for model_A_object, data in result %}
{% for key, value in data.items %}
...
{% endfor %}
{% endfor %}
Limpio y fácil, pero no tan sencillo de descubrir para principiantes. Tenga en cuenta que el primer ciclo for tiene resultado no result.items, ya que ya no es un diccionario, sino una lista de tuplas.
Espero que ayude a alguien.