2011-03-09 8 views
30

Estoy tratando de aprender las plantillas de django, pero no es fácil.
Tengo cierto views.py que contiene un diccionario para representar 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. Me hacen el diccionario de la siguiente manera:¿Cómo hacer un diccionario ordenado en plantillas django?

return render_to_response('results.html', {'data': results_dict}) 

Ahora mi problema es que en mi plantilla que necesito para mostrar los nombres en orden alfabético (o ASCIIbetical) orden con los valores familiares.
En realidad, en mi plantilla que tengo:

<table> 
{% for key, value in data.items %} 
    <tr> 
     <td> {{ key }}: </td> <td> {{ value }} </td> 
    </tr> 
</table> 

¿Cómo puedo representar los datos en forma ordenada? Muchas gracias.

Respuesta

53

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 %} 
    <tr> 
     <td> {{ key }}: </td> <td> {{ value }} </td> 
    </tr> 
{% endfor %} 
6

Refrescante cuestión de edad, sino fue algo en lo que pasé un tiempo como noobie de programación. Se expande la respuesta de Yuji Tomita.

cómo ordenar diccionario que se parece a esto:

{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 el conjunto de consulta que paso a la plantilla.

He conseguido hacer esto (con Shubuntu de #Django ayuda) 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 %} 

limpia y fácil, sin embargo, no es tan simple a la figura fuera para principiantes. Observe que el primer bucle for tiene resultado no result.items ya que ya no es un diccionario, sino una lista de tuplas.

Espero que ayude a alguien.

12

Otra solución que funcionó muy bien para mí y creo que es más simple. Utiliza OrderedDict()more info

En su views.py archivo de complemento:

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, que 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 llaves del diccionario de la misma ordenado que fueron puestos en.

2015-06-20 1 2 
2015-06-21 10 20 
+1

Gracias, funcionó muy bien para mí :) – pyramidface

+0

Works. Sería bueno hacer todo esto dentro de la llamada 'OrderedDict()' – Tunn

Cuestiones relacionadas