Как использовать django-treebeard для создания карты сайта?
Я настроил модель django-treebeard, у которой есть дочерние узлы, а что нет. Как мне теперь отобразить это в моем шаблоне? Это то, что я до сих пор.
Мои модели:
class SiteMapEntry(MP_Node):
name = models.CharField(max_length=100, null=False, blank=False)
url = models.CharField(max_length=1000, null=False, blank=False)
node_order_by = ['name']
class Meta:
verbose_name = "Sitemap Entry"
verbose_name_plural = "Sitemap Entries"
def __unicode__(self):
return ('%s - %s' % (self.name, self.url))
Мои взгляды:
from django.views.generic import ListView
class SiteMap(ListView):
model = SiteMapEntry
template_name = 'sitemaps.html'
Мой шаблон:
{% block content %}
<h1>Sitemap</h1>
<br /><br />
{% for url in object_list %}
<p>{{ url.name }}</p>
<p>{{ url.url }}</p>
{% endfor %}
{% endblock content %}
То, что это делает прямо сейчас, очевидно, это просто перечисление узлов и их дочерних элементов без отступа. Как мне перечислить это как дерево в моем шаблоне?
1 ответ
Вы можете использовать get_annotated_list
метод узла, чтобы получить структуру данных, которую вы можете использовать в шаблоне:
http://django-treebeard.readthedocs.io/en/stable/api.html
Там также есть пример, который показывает вам, как это сделать:
{% for item, info in annotated_list %}
{% if info.open %}
<ul><li>
{% else %}
</li><li>
{% endif %}
{{ item }}
{% for close in info.close %}
</li></ul>
{% endfor %}
{% endfor %}
Посмотрите на dump_bulk
метод, который также возвращает вложенную структуру данных:
http://django-treebeard.readthedocs.io/en/stable/api.html
Надеюсь, это полезно.