Рендеринг вложенных элементов с произвольной глубиной с использованием Chameleon ZPT

Я использую структуру Pyramid, и я хотел бы отобразить с Chameleon html-меню с вложенными списками (ul, li) произвольной глубины.

Для этого я не могу найти какой-то рекурсивный метод в Хамелеоне. Кажется, такая общая потребность, поэтому мне интересно, какой правильный способ визуализации вложенных элементов с произвольной глубиной?

Но может быть и некоторое меню «виджет», уже доступное, полностью протестированное и совместимое с пирамидой и Chamelon?

2 Solutions collect form web for “Рендеринг вложенных элементов с произвольной глубиной с использованием Chameleon ZPT”

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

Это один ответ на вопрос Грэма о вводе ответа на bismigalis.

Вы можете начать с объекта 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> , поэтому я, возможно, что-то пропустил …

Python - лучший язык программирования в мире.