2014-01-08 5 views
1

중첩 된 정렬되지 않은 목록의 형태로 사전의 내용과 구조를 표시하려고합니다.Flask/Jinja2 - 중첩 된 사전을 반복합니다.

내가 함께 당겨 다음과 같습니다 관리했습니다 데이터,이 디렉토리 트리를 나타내는

{'.': {'walk.py': None, 'what.html': None, 'misc': {}, 'orders': {'order1.html': None, 'more': {'stuff.html': None}}}} 

,

.: 
misc/ orders/ walk.py what.html 

./misc: 

./orders: 
more/ order1.html 

./orders/more: 
stuff.html 

가 어떻게이 Jinja2 구문을 사용하여이 반복 가겠어요 ? 이 작업을 수행하는 더 좋은 방법이 있습니까?

감사합니다.

편집 : 나는 어리 석다. 솔루션을 다시 검색 한 후 정확히 내가 무엇을 찾고 있는지 발견했습니다. 첫눈에 내 google-fu는 나와 어울리지 않는다고 생각해보십시오. (워드 프로세서에서 가져온 예) for looprecursive 수정 사용하여 Here it is...

답변

7

:

from jinja2 import Template 

x = Template("""{%- for key, value in tree.iteritems() recursive %} 
{{ '--' * (loop.depth-1) }}{{ key }} 
{%- if value is mapping -%}/{{ loop(value.iteritems()) }}{%- endif -%} 
{%- endfor %} 
""") 

tree = {'.': { 
    'walk.py': None, 
    'what.html': None, 
    'misc': {}, 
    'orders': { 
     'order1.html': None, 
     'more': { 
      'stuff.html': None 
     } 
    } 
}} 

print x.render(tree=tree) 
:

<ul class="sitemap"> 
{%- for item in sitemap recursive %} 
    <li><a href="{{ item.href|e }}">{{ item.title }}</a> 
    {%- if item.children -%} 
     <ul class="submenu">{{ loop(item.children) }}</ul> 
    {%- endif %}</li> 
{%- endfor %} 
</ul> 

UPDATE 여기

내가 생각 해낸 뭔가

출력 :

./ 
--walk.py 
--what.html 
--misc/ 
--orders/ 
----order1.html 
----more/ 
------stuff.html 

(Jinja2 코드의 대시 (예. {%- ... -%}whitespace control입니다. 그와 함께 주위 재생)

+0

이 플라스크 오른쪽 렌더링을 위해 작동합니다 : 내 테스트로 렌더링

@app.route("/") def hello(): return render_template('temp.html',sitemap=process_data()) 

? – removekebab

+0

플라스크로 잘 작동합니다. 고마워. – removekebab

+0

효과가 있다면 다른 사람들이 다음 질문에 대한 답변을 받아 들여야합니다. – codegeek

0

먼저 데이터 정리 :.

data = process_data() 
for k in data.keys(): 
    print k,data[k] 

당신이 얻을 : 당신이 실행하는 경우 이제

a = {'.': {'walk.py': None, 'what.html': None, 'misc': {}, 'orders': {'order1.html': None, 'more': {'stuff.html': None}}}}  

from collections import defaultdict 

def f(data, path): 
    for k,v in data.iteritems(): 
     if v is None: 
      yield path,k 
     else: 
      yield path,k+"/" 
      for k in f(v,path+k+"/"): 
       yield k 

def process_data(): 
    collect = defaultdict(list) 
    for p in f(a,""): 
     if p[0]: 
      collect[p[0][:-1]].append(p[1]) 
    return collect 

./orders ['order1.html', 'more/'] 
./orders/more ['stuff.html'] 
. ['walk.py', 'what.html', 'misc/', 'orders/'] 

그게 당신이 렌더링에 필요한 모든 . 렌더링

{% for k in sitemap.keys()|sort -%} 
    {{ k }}:<br/> 
    {% for v in sitemap[k] %} 
    {{ v }} 
    {%- endfor %} 
    <br/> 
{%- endfor %} 

하고 통화 : 템플릿은 뭔가를해야

.:<br/>  
walk.py 
what.html 
misc/ 
orders/ 
<br/>./orders:<br/>  
order1.html 
more/ 
<br/>./orders/more:<br/>  
stuff.html 
<br/> 
관련 문제