3

私は Pyramid フレームワークを使用しており、カメレオンを使用して、任意の深さのネストされたリスト (ul、li) を含む html メニューをレンダリングしたいと考えています。

そうするために、カメレオンである種の再帰的な方法を見つけることができません。それは非常に一般的なニーズのように思われるので、ネストされた要素を任意の深さでレンダリングする正しい方法は何だろうと思っています。

しかし、いくつかのメニュー «widget» がすでに利用可能で、完全にテストされ、ピラミッドと Chamelon と互換性があるかもしれません。

4

2 に答える 2

3
<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>
于 2013-02-04T12:49:23.987 に答える
1

これは、ビスミガリスの回答への入力に関するGraemeの質問に対する1つの回答です。

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>タグが混じっているようなので見落としがあるかもしれませんが…

于 2014-06-25T04:06:11.030 に答える