Визуализация вложенных элементов с произвольной глубиной с помощью Chameleon ZPT
Я использую платформу Pyramid, и я хотел бы сделать с Chameleon html-меню с вложенными списками (ul, li) произвольной глубины.
Я не могу найти какой-то рекурсивный метод в Хамелеоне, чтобы сделать это. Кажется, это такая общая потребность, поэтому мне интересно, как правильно отобразить вложенные элементы с произвольной глубиной?
Но, может быть, уже есть какой-то "виджет" меню, полностью протестированный и совместимый с пирамидой и хамелоном?
2 ответа
<ul metal:define-macro="comment_list">
<li tal:repeat="comment comments" class="comment" comment_id="${comment.id}">
<div>ID: ${comment.id} ${comment.body}</div>
<div tal:define="comments comment.children">
<ul metal:use-macro="template.macros['comment_list']" />
</div>
</li>
</ul>
Это один из ответов на вопрос Грэма о входе в ответ бисмигалиса.
Вы бы начали с Comment
объект как это:
class Comment():
id = 0
body = ""
children = []
def __init__(self, id, body, children):
self.id = id
self.body = body
self.children = children
Затем вы создадите список комментариев и их детей. Ради того, чтобы поиграть, я просто сделал это вручную (извините, если это не правильно стилизовано):
comments = []
comment1 = Comment(1, "First comment", None)
comment2 = Comment(2, "Second comment", [
Comment(3, "Third comment", [
Comment(5, "Fifth comment", None)
]
),
Comment(4, "Fourth comment", None),
]
)
comment6 = Comment(6, "Sixth comment", None)
comments.append(comment1)
comments.append(comment2)
comments.append(comment6)
Затем вы просто сделаете его частью возвращаемого словаря из своего кода представления:
return {'comments': comments}
Код шаблона в ответе bismagalis сгенерирует следующий HTML-код:
<ul>
<li class="comment" comment_id="1">
<div>ID: 1 First comment</div>
<div>
<ul>
</ul>
</div>
</li>
<li class="comment" comment_id="2">
<div>ID: 2 Second comment</div>
<div>
<ul>
<li class="comment" comment_id="3">
<div>ID: 3 Third comment</div>
<div>
<ul>
<li class="comment" comment_id="5">
<div>ID: 5 Fifth comment</div>
<div>
<ul>
</ul>
</div>
</li>
</ul>
</div>
</li>
<li class="comment" comment_id="4">
<div>ID: 4 Fourth comment</div>
<div>
<ul>
</ul>
</div>
</li>
</ul>
</div>
</li>
<li class="comment" comment_id="6">
<div>ID: 6 Sixth comment</div>
<div>
<ul>
</ul>
</div>
</li>
</ul>
Похоже, есть немало посторонних <div>
а также <ul>
там смешались теги, так что, возможно, я что-то пропустил...