Nasıl bir ağaç yapısını (özyinelemeli) bir Django şablonu kullanarak işleyebilen?

oy
47

Ben Django şablonu kullanarak HTML işlemek istiyorum bellekte bir ağaç yapısına sahiptir.

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

Bazı nesne olacak rootbir olduğunu Nodeve childrenbir listesidir Nodes. rootşablonun içeriğinde geçilecek.

Ben bulduk bu bu sağlanabilir nasıl bir tartışma, ama afiş bu bir üretim ortamında iyi olmayabilir düşündürmektedir.

Herkes daha iyi bir yol biliyor mu?

Oluştur 28/08/2008 saat 10:43
kaynak kullanıcı
Diğer dillerde...                            


10 cevaplar

oy
25

Ben kurallı cevap olduğunu düşünüyorum: "Yapma".

Bunun yerine ne muhtemelen gerektiğini sizin de şey çözülmeye olan bakış kodu, bu nedenle (içinde | de) yinelemek meselesi şablonda ezik. Ben ağacın içinden recursing ve sonra şablona o "seyahatname" listesi gönderilirken bir listeye girintiler ve dedents ekleyerek bunu düşünüyorum. (şablon sonra eklemek istiyorum <li>ve </li>bunun "anlayışı" ile özyinelemeli yapısı oluşturma, bu listeden.)

Ben de yinelemeli bir gerçekten şablon dosyalarını içeren eminim yanlış Bunu yapmanın yolu ...

Cevap 28/08/2008 saat 11:47
kaynak kullanıcı

oy
18

Bu İhtiyacınız çok daha fazla olabilir, ama 'mptt' adlı bir Django modülü var - bu bir sql veritabanında hiyerarşik bir ağaç yapısı depolar ve görünümü kodunda ekran için şablonlar içerir. Orada yararlı bir şeyler bulmak mümkün olabilir.

Burada link: django-mptt

Cevap 28/08/2008 saat 16:23
kaynak kullanıcı

oy
-2

Ben ancak ben ilk JavaScript kullanarak çözümünü uygulamaya etmişti, benzer bir sorunu vardı ve sadece daha sonra Django şablonlarında aynı şeyi yapardı nasıl düşündü.

Ben json içine modelleri listesini kapatmak için seri hale getirici programı kullanılmıştır ve benim hiyerarşi için bir temel olarak json verilerini kullandı.

Cevap 03/09/2008 saat 11:25
kaynak kullanıcı

oy
9

Django tam bu senaryo için şablon yardımcı inşa etti:

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

Cevap 07/09/2008 saat 07:49
kaynak kullanıcı

oy
7

Ben aynı sorunu vardı ve bir şablon etiketi yazdı. Diğer etiketler orada bu söylenmemesi gibi olduğunu biliyorum ama yine de özel etiketler yapmayı öğrenmek için gerekli :) Ben oldukça iyi çıktı düşünüyorum.

Kullanım talimatları için docstring'ini okuyun.

github.com/skid/django-recurse

Cevap 05/06/2009 saat 18:40
kaynak kullanıcı

oy
56

Kullanılması withşablon etiketi, ben ağaç / özyinelemeli liste yapabilirdi.

Basit kod:

Ana şablonu: 'all_root_elems' varsayarak ağacın bir veya daha fazla kök listesi

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

tree_view_template.html iç içe kılan ul, live kullanır nodeaşağıdaki gibi şablon değişkenini:

<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>
Cevap 25/07/2012 saat 06:21
kaynak kullanıcı

oy
10

Evet, bunu yapabilirsin. Bu {%% ekleyin} için dosya adı geçen küçük bir hile bir değişken olarak:

{% with template_name="file/to_include.html" %}
{% include template_name %}
{% endwith %}
Cevap 24/09/2012 saat 02:50
kaynak kullanıcı

oy
0

dicts gibi kimse var mı? Ben burada bir şey eksik olabilir ama kurulum menülerine en doğal yolu görünüyor. girişleri ve bağlantılar bir DIV / NAV bunu pop olarak değerler olarak tuşlarını kullanarak ve uzağa gitmek!

senin tabanından

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

Bu çağrı

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

Bu varsayılan denemedim ya da belki var henüz sipariş?

Cevap 25/09/2014 saat 17:06
kaynak kullanıcı

oy
6

Ben Hepiniz çok gereksiz kullanın) çok geç kaldım ile etiketleri, bu i recuesive böyle yaparız:

Ana şablonda:

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

Sonra menu.html içinde:

{% 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 %}
Cevap 26/10/2015 saat 05:31
kaynak kullanıcı

oy
0

Bunu düzeltmek:

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>

- örneğin, model:

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)
Cevap 30/07/2017 saat 08:50
kaynak kullanıcı

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