Hvordan kan jeg gjøre en trestruktur (rekursiv) med en django mal?

stemmer
50

Jeg har en trestruktur i minnet at jeg ønsker å gjengi i HTML ved hjelp av en Django mal.

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

Det vil være et objekt rootsom er en Node, og childrener en liste over Nodes. rootvil bli vedtatt i innholdet av malen.

Jeg har funnet dette en diskusjon om hvordan dette kan oppnås, men plakaten tyder dette kan ikke være god i et produksjonsmiljø.

Er det noen som vet om en bedre måte?

Publisert på 28/08/2008 klokken 11:43
kilden bruker
På andre språk...                            


10 svar

stemmer
61

Ved hjelp av withmal tag, kunne jeg gjøre tre / rekursiv listen.

Eksempelkode:

Hoved mal: antar 'all_root_elems' er listen over ett eller flere roten av treet

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

tree_view_template.html gjengir den nestede ul, liog bruker nodemal variabel som følger:

<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>
Svarte 25/07/2012 kl. 07:21
kilden bruker

stemmer
27

Jeg tror den kanoniske svaret er: "ikke".

Hva bør du sannsynligvis gjøre i stedet er løse ting i visningen kode, så det er bare et spørsmål om gjentar over (i | de) bulker i malen. Jeg tror jeg ville gjøre det ved å legge innrykk og dedents til en liste mens recursing gjennom treet og deretter sende at "reiseskildring" -listen til malen. (templaten vil deretter sette inn <li>og </li>fra denne listen, skaper den rekursive struktur med "forståelsen" den.)

Jeg er også ganske sikker på at rekursivt inkludert malfiler er virkelig en feil måte å gjøre det ...

Svarte 28/08/2008 kl. 12:47
kilden bruker

stemmer
19

dette kan være mye mer enn du trenger, men det er en django modul kalt 'MPTT' - dette lagrer en hierarkisk trestruktur i en SQL-database, og inneholder maler for visning i visningen kode. du kan være i stand til å finne noe nyttig der.

her er linken: Django-MPTT

Svarte 28/08/2008 kl. 17:23
kilden bruker

stemmer
11

Ja, du kan gjøre det. Det er et lite triks, passerer filnavnet til {% inkludere%} som en variabel:

{% with template_name="file/to_include.html" %}
{% include template_name %}
{% endwith %}
Svarte 24/09/2012 kl. 03:50
kilden bruker

stemmer
9

Django har en innebygd mal hjelper for denne eksakte scenario:

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

Svarte 07/09/2008 kl. 08:49
kilden bruker

stemmer
8

Jeg er for sent) Alle dere bruker så mye unødvendig med tags, dette er hvordan jeg gjør recuesive:

i hoved mal:

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

deretter i 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 %}
Svarte 26/10/2015 kl. 07:31
kilden bruker

stemmer
7

Jeg hadde det samme problemet, og jeg skrev en mal tag. Jeg vet det er andre koder som det ut av dette, men jeg trengte å lære å lage egendefinerte koder uansett :) jeg tror det viste seg ganske bra.

Les docstring for bruksinstruksjoner.

github.com/skid/django-recurse

Svarte 05/06/2009 kl. 19:40
kilden bruker

stemmer
0

korrigere dette:

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>

for eksempel - modell:

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)
Svarte 30/07/2017 kl. 09:50
kilden bruker

stemmer
0

Har ingen som dicts? Jeg mangler kanskje noe her, men det ville synes den mest naturlige måten å sette opp menyer. Ved hjelp av tastene som oppføringer og verdier som lenker dukker det i en DIV / NAV og vekk du går!

Fra din base

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

kaller dette

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

Det har ikke prøvd standard eller bestilt ennå kanskje du har?

Svarte 25/09/2014 kl. 18:06
kilden bruker

stemmer
-2

Jeg hadde et lignende problem, men jeg hadde først implementert løsningen ved hjelp av Javascript, og bare etterpå vurdert hvordan jeg ville ha gjort det samme i Django maler.

Jeg brukte serialisering verktøyet til å snu en liste av modeller i JSON, og brukes JSON data som grunnlag for min hierarki.

Svarte 03/09/2008 kl. 12:25
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more