web-dev-qa-db-fra.com

Comment rendre un dictionnaire ordonné dans des modèles Django?

J'essaie d'apprendre les modèles Django mais ce n'est pas facile.
J'ai un certain views.py contenant un dictionnaire à rendre avec un modèle. Le dictionnaire est constitué de paires clé-valeur, où clé sont des noms uniques et les valeurs sont des valeurs associées à ces noms. Je rend le dictionnaire de la manière suivante:

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

Maintenant, mon problème est que dans mon modèle, j'ai besoin d'afficher les noms par ordre alphabétique (ou ASCIIbétique) avec les valeurs des parents.
En fait, dans mon modèle, j'ai:

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

Comment puis-je rendre les données de manière triée? Merci beaucoup.

39
green69

Dans views.py (Python2):

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

Ou dans views.py (Python3):

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

Dans le fichier modèle:

{% for key, value in data.items() %}
    <tr>
        <td> {{ key }}: </td> <td> {{ value }} </td>
    </tr>
{% endfor %}
60

Bien qu'il soit préférable de modifier le code dans la vue, vous pouvez également utiliser la balise de modèle 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>
25
Rafael

Une autre solution qui a très bien fonctionné pour moi et je pense que c'est plus simple. Il utilise OrderedDict()plus d'informations

Dans ton views.py ajout de fichier:

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})

Ensuite, dans votre modèle, vous pouvez faire:

<table>
{% for key, value in context.items %}
    <tr>
        <td>{{ key }}</td>
        <td>{{ value.a }}</td>
        <td>{{ value.b }} </td>
    </tr>
{% endfor %}
</table>

Cela renverra les clés du dictionnaire dans le même ordre où elles ont été insérées.

2015-06-20  1   2
2015-06-21  10  20
16
tokenizer_fsj

Rafraîchissant vieille question mais c'était quelque chose sur lequel j'ai passé du temps en tant que noobie de programmation. Cela élargit en quelque sorte la réponse de Yuji Tomita.

Comment trier un dictionnaire qui ressemble à ceci:

{model_A_object: {key: value, ...},...}

par model_A_object.field.

Je le remplis de boucle for et l'utilise pour stocker une agrégation, etc., des données pour l'ensemble de requêtes que je passe au modèle.

J'ai réussi à le faire (avec Shubuntu de l'aide #Django) en:

    result = sorted(dictionary.iteritems(), key= lambda (k, v) :  (k.field, v))

Puis dans le modèle:

    {% for model_A_object, data in result %}
        {% for key, value in data.items %}
            ...
        {% endfor %}
    {% endfor %}

Propre et facile, mais pas aussi simple à comprendre pour les débutants. Notez que la première boucle for a result not result.items car ce n'est plus un dictionnaire, mais une liste de tuples.

J'espère que cela aide quelqu'un.

8
Marek