Je veux imprimer un dictionnaire, trié par la clé. Tri des touches est facile dans la vue, en mettant simplement les touches dans une liste, puis triant la liste. Comment puis-je parcourir les touches du modèle, puis obtenir la valeur du dictionnaire. (vient de faire l'exemple ...)
La partie qui ne fonctionne pas est la partie "Company_Dict.Company.items". J'ai besoin de la "société" pour être la valeur de la société. À l'heure actuelle, la société PRIM recherche une clé nommée «société» et non la valeur de la "société" de la boucle ci-dessus. P> Je fais un peu de traitement pour mettre le dictionnaire des dictionnaires ensemble. Changer la mise en page des données n'est pas vraiment une option. Je pense que la bonne approche consiste à écrire une balise de modèle, je voulais juste savoir s'il y avait une façon intégrée que j'ai manquée. P> p>
6 Réponses :
Un filtre de modèle personnalisé fera le tour.
{% for employee, dependents in company_dict|company %}
Merci beaucoup! Je devais modifier ce que vous avez fait un peu. Mon filtre renvoie "Valeur [arg] .iteritems ()" et le modèle ressemble donc: {% pour employé, personnes à charge de société_dict | get_dict_and_iter: société%}
Hé quoi que ça marche. La plupart des gens utilisant ce site pourraient également modifier ce que j'ai fait à leur situation.
Créer un filtre personnalisé, qui ressemble à ceci: puis dans votre modèle, vous devez l'appeler à l'aide de: p> vous sera capable d'obtenir la clé de tri par clé. p> p>
Peut-être que presque exact duplicata, mais tandis que l'autre que l'autre, cette réponse m'a aidé et est papa brillante, merci beaucoup!
Cela m'a également aidé plus que la réponse précédente!
"Marquage d'un filtre is_safe coercera la valeur de retour du filtre à une chaîne. Si votre filtre doit renvoyer une valeur booléenne ou autre non-chaîne, le marquant IS_Safe aura probablement des conséquences inattendues (telles que la conversion d'une false booléenne à la chaîne. 'Faux'). " I> ( Documentation Django ) Donc, il est probablement préférable de supprimer cette ligne is_safe.
Aussi, SORTEDDICT code> est obsolète à partir de Django 1.7 et sera supprimé à Django 1.9. . Utilisez Collections.OrderedDict Code> à la place (disponible dans Python 2.7 et dans Python 3 ).
Essayé et testé. Fonctionne parfaitement! Merci pour la solution.
Cette dernière solution m'a été très utile aussi. J'utilise Django 1.6.2, et il semble convertir une dict en une liste avec la clé en tant que première élimination de cette liste et le contenu comme deuxième. Donc, même lorsque je passe dans un dict, cela traite comme une liste. Alors j'ai modifié ce qui précède pour ressembler à cela, et ça marche pour moi:
@register.filter(name='sort')
def listsort(value):
if isinstance(value, list):
return sorted(value, key=lambda k:k[0])
else:
return value
Pour certains Filtre de Turikumwe non conçu pour moi (Python3.4, Django 1.7), donc je la réécris pour revenir à la liste des tuples au lieu de donc dans le modèle Nous n'avons pas besoin d'obtenir SertedDict code> ou ordonné de commande code>: .items code> p>
La réponse de Turikumwe m'a fait près, mais n'a pas travaillé pour mon environnement: Python3 et Django 1.10.
J'ai trouvé que invoquant le filtre avec: p> entraîne réellement un objet ItemView, pas un dict. (Je soupçonne que c'est un problème Python 2 VS 3). Compte tenu de l'optionview, la réponse est encore plus facile p>
Vous pouvez utiliser django's dictsort ou DictsorTreversed .
{% for user in list_users|dictsortreversed:'created_at' %}
{{user.username}} - {{user.created_at}}
{% endfor %}
Une raison pour laquelle vous ne faites-vous pas cela dans la vue?
C'est un tas de traitement. Et pour le mettre en place de manière à ne pas avoir à faire quoi que ce soit dans le modèle, prendrait une deuxième passe aux données. Je suppose que je pouvais juste faire ça ... pensé s'il était possible de partir tel quel, ce serait mieux.
Le filtre intégré de Django Dictsort Trie les valeurs basées sur un clé mais cela ne trie pas les clés elles-mêmes.