usar template examples bootstrap python django

python - template - include django



¿Cómo puedo renderizar una estructura de árbol(recursiva) usando una plantilla django? (10)

¿A nadie le gustan los dicts? Puede que me falta algo aquí, pero parece la forma más natural de configurar los menús. Usar claves como entradas y valores como enlaces lo abren en un DIV / NAV y listo.

Desde tu base

# Base.html <nav> {% with dict=contents template="treedict.html" %} {% include template %} {% endwith %} <nav>

llama esto

# TreeDict.html <ul> {% for key,val in dict.items %} {% if val.items %} <li>{{ key }}</li> {%with dict=val template="treedict.html" %} {%include template%} {%endwith%} {% else %} <li><a href="{{ val }}">{{ key }}</a></li> {% endif %} {% endfor %} </ul>

No ha intentado el valor predeterminado o ordenado, pero tal vez usted tiene?

Tengo una estructura de árbol en memoria que me gustaría representar en HTML usando una plantilla de Django.

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

Habrá alguna root objeto que sea un Node , y children es una lista de Node s. root pasará en el contenido de la plantilla.

He encontrado esta discusión sobre cómo se puede lograr esto, pero el cartel sugiere que esto podría no ser bueno en un entorno de producción.

¿Alguien sabe de una mejor manera?


Creo que la respuesta canónica es: "No".

Lo que probablemente debería hacer en su lugar es desenredar la cosa en su código de vista , por lo que solo se trata de iterar sobre (en | de) dents en la plantilla. Creo que lo haría añadiendo sangrías y comentarios a una lista mientras repito a través del árbol y luego enviando esa lista de "viaje" a la plantilla. (la plantilla insertaría <li> y </li> de esa lista, creando la estructura recursiva con "comprensión").

También estoy bastante seguro de que recursivamente, incluidos los archivos de plantilla, es una manera incorrecta de hacerlo ...



Si, puedes hacerlo. Es un pequeño truco, pasar el nombre de archivo a {% include%} como una variable:

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


Tuve el mismo problema y escribí una etiqueta de plantilla. Sé que hay otras etiquetas como esta, pero tenía que aprender a hacer etiquetas personalizadas de todos modos :) Creo que resultó bastante bien.

Lea la docstring para obtener instrucciones de uso.

github.com/skid/django-recurse


Tuve un problema similar, sin embargo, primero implementé la solución usando JavaScript, y luego pensé en cómo habría hecho lo mismo en las plantillas de django.

Usé la utilidad de serialización para convertir una lista de modelos en json, y utilicé los datos json como base para mi jerarquía.


Usando la etiqueta de plantilla, podría hacer una lista de árbol / recursiva.

Código de muestra:

plantilla principal: asumiendo que ''all_root_elems'' es una lista de una o más raíces del árbol

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

tree_view_template.html representa la variable anidada ul , li y utiliza la plantilla de node siguiente manera:

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


Ya es demasiado tarde) Usan mucho innecesario con las etiquetas, así es como lo hago:

en la plantilla principal:

<!-- lets say that menu_list is already defined --> <ul> {% include "menu.html" %} </ul>

luego en menu.html:

{% for menu in menu_list %} <li> {{ menu.name }} {% if menu.submenus|length %} <ul> {% include "menu.html" with menu_list=menu.submenus %} </ul> {% endif %} </li> {% endfor %}


corregir esto:

root_comment.html

{% extends ''students/base.html'' %} {% load i18n %} {% load static from staticfiles %} {% block content %} <ul> {% for comment in comments %} {% if not comment.parent %} ## add this ligic {% include "comment/tree_comment.html" %} {% endif %} {% endfor %} </ul> {% endblock %}

tree_comment.html

<li>{{ comment.text }} {%if comment.children %} <ul> {% for ch in comment.children.get_queryset %} # related_name in model {% with comment=ch template_name="comment/tree_comment.html" %} {% include template_name %} {% endwith %} {% endfor %} </ul> {% endif %} </li>

por ejemplo - modelo:

from django.db import models from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ # Create your models here. class Comment(models.Model): class Meta(object): verbose_name = _(''Comment'') verbose_name_plural = _(''Comments'') parent = models.ForeignKey( ''self'', on_delete=models.CASCADE, parent_link=True, related_name=''children'', null=True, blank=True) text = models.TextField( max_length=2000, help_text=_(''Please, your Comment''), verbose_name=_(''Comment''), blank=True) public_date = models.DateTimeField( auto_now_add=True) correct_date = models.DateTimeField( auto_now=True) author = models.ForeignKey(User)


esto podría ser mucho más de lo que necesita, pero hay un módulo django llamado ''mptt'': almacena una estructura de árbol jerárquica en una base de datos sql e incluye plantillas para visualizar en el código de vista. es posible que puedas encontrar algo útil allí.

aquí está el enlace: django-mptt