8
votes

Django | Trier dict dans le modèle

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. XXX

(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.

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.


3 commentaires

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.


6 Réponses :


3
votes

Un filtre de modèle personnalisé fera le tour.

{% for employee, dependents in company_dict|company %}


2 commentaires

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.



19
votes

Créer un filtre personnalisé, qui ressemble à ceci: xxx

puis dans votre modèle, vous devez l'appeler à l'aide de: xxx

vous sera capable d'obtenir la clé de tri par clé.


5 commentaires

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'). " ( Documentation Django ) Donc, il est probablement préférable de supprimer cette ligne is_safe.


Aussi, SORTEDDICT est obsolète à partir de Django 1.7 et sera supprimé à Django 1.9. . Utilisez Collections.OrderedDict à la place (disponible dans Python 2.7 et dans Python 3 ).


Essayé et testé. Fonctionne parfaitement! Merci pour la solution.



1
votes

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


0 commentaires

0
votes

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 SertedDict ou ordonné de commande : xxx

donc dans le modèle Nous n'avons pas besoin d'obtenir .items xxx


0 commentaires

0
votes

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: xxx

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 xxx


0 commentaires

0
votes

Vous pouvez utiliser django's dictsort ou DictsorTreversed .

{% for user in list_users|dictsortreversed:'created_at' %}
    {{user.username}} - {{user.created_at}}
{% endfor %}


0 commentaires