Πώς μπορώ να καταστήσουν μια δομή δέντρου (recursive) χρησιμοποιώντας ένα πρότυπο Django;

ψήφοι
47

Έχω μια δομή δέντρου στη μνήμη που θα ήθελα να καταστήσει το HTML χρησιμοποιώντας ένα πρότυπο Django.

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

Θα υπάρξει κάποιο αντικείμενο rootπου είναι Node, και childrenείναι μια λίστα των Nodes. rootθα περάσει στο περιεχόμενο του προτύπου.

Βρήκα αυτό μια συζήτηση για το πώς αυτό μπορεί να επιτευχθεί, αλλά η αφίσα δείχνει αυτό δεν μπορεί να είναι καλό σε ένα περιβάλλον παραγωγής.

Ξέρει κανείς από έναν καλύτερο τρόπο;

Δημοσιεύθηκε 28/08/2008 στις 12:43
πηγή χρήστη
Σε άλλες γλώσσες...                            


10 απαντήσεις

ψήφοι
25

Νομίζω ότι η κανονική απάντηση είναι: «Μην».

Τι μάλλον θα πρέπει να κάνετε αντί να είναι ξετυλίξουν το πράγμα που σου άποψη κώδικα, έτσι είναι ακριβώς ένα θέμα επανάληψη πάνω (σε | de) βαθουλώματα στο πρότυπο. Νομίζω ότι θα το κάνω με την επισύναψη περιπτώσεις και dedents σε μια λίστα, ενώ την αναδρομική μέσω του δέντρου και στη συνέχεια την αποστολή ο κατάλογος «οδοιπορικό» στο πρότυπο. (το πρότυπο θα στη συνέχεια τοποθετήστε <li>και </li>από τον κατάλογο, δημιουργώντας την αναδρομική δομή με «κατανόηση» του.)

Είμαι επίσης αρκετά βέβαιος αναδρομικά συμπεριλαμβανομένων των αρχείων πρότυπο είναι πραγματικά ένα λάθος τρόπος για να το κάνει ...

Απαντήθηκε 28/08/2008 στις 13:47
πηγή χρήστη

ψήφοι
18

αυτό μπορεί να είναι πολύ περισσότερο από ό, τι χρειάζεστε, αλλά υπάρχει μια ενότητα Django ονομάζεται «mptt» - αυτό αποθηκεύει μια ιεραρχική δομή δέντρου σε μια βάση δεδομένων SQL, και περιλαμβάνει πρότυπα για την προβολή του κώδικα προβολή. να είστε σε θέση να βρείτε κάτι χρήσιμο εκεί.

εδώ είναι το link: Django-mptt

Απαντήθηκε 28/08/2008 στις 18:23
πηγή χρήστη

ψήφοι
-2

Είχα ένα παρόμοιο πρόβλημα, όμως είχα εφαρμόστηκε για πρώτη φορά τη λύση χρησιμοποιώντας JavaScript, και μόνο στη συνέχεια θεωρείται πως θα είχα κάνει το ίδιο πράγμα σε πρότυπα Django.

Θα χρησιμοποιηθεί το βοηθητικό πρόγραμμα serializer να μετατρέψει μια λίστα από τα μοντέλα σε JSON, και να χρησιμοποιηθούν τα δεδομένα JSON ως βάση για την ιεραρχία μου.

Απαντήθηκε 03/09/2008 στις 13:25
πηγή χρήστη

ψήφοι
9

Django έχει ένα ενσωματωμένο στο πρότυπο βοηθός για αυτό ακριβώς το σενάριο:

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

Απαντήθηκε 07/09/2008 στις 09:49
πηγή χρήστη

ψήφοι
7

Είχα το ίδιο πρόβλημα και έγραψα μια ετικέτα πρότυπο. Ξέρω ότι υπάρχουν και άλλες ετικέτες, όπως αυτή εκεί έξω, αλλά έπρεπε να μάθουν να κάνουν προσαρμοσμένες ετικέτες έτσι κι αλλιώς :) Νομίζω ότι αποδείχθηκε αρκετά καλά.

Διαβάστε το docstring για οδηγίες χρήσης.

github.com/skid/django-recurse

Απαντήθηκε 05/06/2009 στις 20:40
πηγή χρήστη

ψήφοι
56

Χρησιμοποιώντας withτην ετικέτα πρότυπο, θα μπορούσα να κάνω δέντρο / αναδρομική λίστα.

Δείγμα κώδικα:

κύριο πρότυπο: υποθέτοντας «all_root_elems» είναι η λίστα ενός ή περισσοτέρων ρίζα του δέντρου

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

tree_view_template.html καθιστά το ένθετα ul, liκαι χρησιμοποιεί nodeμεταβλητό πρότυπο όπως παρακάτω:

<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>
Απαντήθηκε 25/07/2012 στις 08:21
πηγή χρήστη

ψήφοι
10

Ναι, μπορείτε να το κάνετε. Είναι ένα μικρό κόλπο, περνώντας το όνομα του αρχείου στο {% συμπεριλάβει%} ως μεταβλητή:

{% with template_name="file/to_include.html" %}
{% include template_name %}
{% endwith %}
Απαντήθηκε 24/09/2012 στις 04:50
πηγή χρήστη

ψήφοι
0

Μήπως δεν είναι σαν DICTS; Θα μπορούσε να λείπει κάτι εδώ, αλλά φαίνεται ο πιο φυσικός τρόπος για μενού ρυθμίσεων. Χρήση των πλήκτρων όπως εγγραφές και τις αξίες και συνδέσμους ποπ σε ένα DIV / NAV και μακριά πηγαίνετε!

Από τη βάση σας

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

ονομάζουμε

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

Δεν έχω δοκιμάσει το προεπιλεγμένο ή το παραγγείλει ακόμα ίσως έχετε;

Απαντήθηκε 25/09/2014 στις 19:06
πηγή χρήστη

ψήφοι
6

Είμαι πάρα πολύ αργά) Όλα τα χρησιμοποιείτε τόσο πολύ περιττό με ετικέτες, αυτό είναι το πώς να κάνω recuesive:

το κύριο πρότυπο:

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

Στη συνέχεια το 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 %}
Απαντήθηκε 26/10/2015 στις 07:31
πηγή χρήστη

ψήφοι
0

το διορθώσετε:

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>

για παράδειγμα - το μοντέλο:

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)
Απαντήθηκε 30/07/2017 στις 09:50
πηγή χρήστη

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