11

たとえば、JSONファイルがあります

{
    "Google":{
    "Web":"www.web.de",
    "Apps":{
        "Drive": "DriveLink",
        "Dropbox": "DropboxLink"
    },
    "Google Main":"http://mail.google.com",
    "G+":"http://plus.google.com"
    },  
    "Social":{
    "Facebook":"http://www.facebook.de",
    "G+":"https://plus.google.com",
    "Xing":"http://www.xing.de",
    "LinkedIn":"http://www.linkedin.com",
    "Tumblr":"http://www.tumblr.com"
    },
    "Fun":{
    "Reddit":"http://www.reddit.com"
    }
}

ご覧のとおり、Google セクションの下に、Apps という名前のネストされたセクションがあります。

CherryPy を使用して、次のようにこの JSON オブジェクトを linksList という名前で引き渡します。

@cherrypy.expose
def index(self):
    linksFile = open('links.json', 'r')
    linksList = json.load(linksFile) 

    template = jinjaEnv.get_template('index.html')
    return template.render(linksList=linksList)

私が望むのは、次のようにレンダリングすることです:

  1. グーグル
    • Web (リンクとして)
    • Google メイン
    • G+
    • アプリ
      • ドライブ
      • ドロップボックス
  2. 社交
    • フェイスブック
    • G+

等々

私が理解していないのは、このネストされた「アプリ」のようなオブジェクトを再帰的にレンダリングすることです

4

2 に答える 2

16

ドキュメントには次のように書かれています。

ループを再帰的に使用することができます。これは、サイトマップなどの再帰的なデータを扱う場合に役立ちます。ループを再帰的に使用するには、基本的に再帰修飾子をループ定義に追加し、再帰したい場所で新しい iterable を使用してループ変数を呼び出す必要があります。

あなたの場合、これは次のようにして達成されます。

<ul>
{% for key, value in linksList.items() recursive %}
    <li>
    {% if value is string %}
        <a href="{{ value }}">{{ key }}</a>
    {% else %}
        {{ key }}
        <ul>{{ loop(value.items()) }}</ul>
    {% endif %}
    </li>
{% endfor %}
</ul>
于 2012-08-12T16:42:54.403 に答える