Saltar al contenido

¿Cómo puedo crear un árbol json desde django-mptt?

Solución:

Si usa la funcionalidad de plantilla de django-mptt para generar los datos JSON, debería poder hacer algo como lo siguiente:

var json =    
{% recursetree nodes %}
{
    id: "{{ node.id }}",   
    name: "{{ node.name }}",   
    data: {},   
    children: [{{ children }}]
},
{% endrecursetree %}

La etiqueta de los niños es brillante, básicamente llamando a recursetree para cada niño del nodo. Sin embargo, se genera un poco de desorden alrededor de las comas con esta solución, ya que el ejemplo de mptt se trata de elementos de lista donde tales cosas no son un problema.

Un fragmento de código un poco más grande resuelve esto:

var json =    
{
    id: "{{ root.id }}",   
    name: "{{ root.name }}",   
    data: {},   
    children: [{% recursetree root.children %}
    {
        id: "{{ node.id }}",   
        name: "{{ node.name }}",   
        data: {},   
        children: [{{ children }}]
    }
    {% endrecursetree %}]
}

Al hacer una distinción entre el nodo raíz (suponiendo que solo hay uno) que no reside dentro de una matriz, sino que está asignado a una variable, en comparación con otros nodos que viven dentro de los hijos de otro nodo, el var x = y, se evita el problema.

Todavía hay un problema con children: [x,y,z,] tener una coma al final. Si esa coma final está generando errores, en la vista que ha llamado a la plantilla, siempre puede hacer un reemplazo rápido de cadena para reemplazar ,] con ]

Alternativamente, puede alterar el {{ children }} llamada de mptt de alguna manera para tomar una cadena de unión, pero eso implicaría mucho más trabajo.

Cree JSON sin el problema de las comas finales:

{% full_tree_for_model YOUR_APP.YOUR_MODEL as nodes %}

var json =  {% for genre,structure in nodes|tree_info %}{% if structure.new_level %} [{ {% else %} },{ {% endif %}
id: "{{ genre.id }}",
children: {% if genre.is_leaf_node %}[]{% endif %}
{% for level in structure.closed_levels %}}]{% endfor %}{% endfor %}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *