76 votes

Comment puis-je rendre une arborescence (récursive) à l'aide d'un modèle django?

J'ai une arborescence dans la mémoire que je voudrais rendre en HTML à l'aide d'un modèle Django.

class Node():
  name = "node name"
  children = []

Il y aura un objet root c'est un Node, et children une liste d' Nodes. root seront passés dans le contenu du modèle.

J'ai trouvé cela d'une discussion de la façon dont cela pourrait être réalisé, mais l'affiche suggère que cela peut ne pas être bon dans un environnement de production.

Quelqu'un sait d'une meilleure façon?

85voto

Rohan Points 22386

En utilisant la balise de modèle with , je pourrais faire une liste arborescente / récursive.

Tous les commentaires sont les bienvenus.

Exemple de code:

modèle principal: en supposant que 'all_root_elems' est la liste d'une ou de plusieurs racines d'arbre

 <ul>
{%for node in all_root_elems %} 
    {%include "tree_view_template.html" %}
{%endfor%}
</ul>
 

tree_view_template.html rend la variable de modèle imbriquée ul , li et utilise node comme ci-dessous:

 <li> {{node.name}}
    {%if node.has_childs %}
        <ul>
         {%for ch in node.all_childs %}
              {%with node=ch template_name="tree_view_template.html" %}
                   {%include template_name%}
              {%endwith%}
         {%endfor%}
         </ul>
    {%endif%}
</li>
 

30voto

Anders Eurenius Points 2976

Je pense que la réponse canonique est: "Ne fais pas".

Ce que vous devriez faire à la place est de démêler la chose dans votre vue code, c'est juste une question de parcourir (en|de), les bosses dans le modèle. Je pense que je le ferais en ajoutant des tirets et dedents à une liste de tout recursing par le biais de l'arbre, puis l'envoi de ce "carnet de route" de la liste pour le modèle. (le modèle puis insérez - <li> et </li> à partir de cette liste, la création de la structure récursive avec la "compréhension" il.)

Je suis aussi assez sûr de manière récursive, y compris les fichiers de modèle est vraiment une mauvaise façon de le faire...

12voto

Vladimir Points 281

Oui tu peux le faire. C'est un petit truc, passer le nom du fichier à {% include%} en tant que variable:

 {% with template_name="file/to_include.html" %}
{% include template_name %}
{% endwith %}
 

10voto

John Points 5478

Django a un assistant de modèle intégré pour ce scénario précis:

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#unordered-list

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X