2017-03-09 30 views
0

我正在一個擁有幾乎無窮無盡的孩子的jinja模板中循環查看字典。孩子們包含集合和字典。我試圖環比下面的數據集,並通過神社打印如下面的例子:Jinja2通過python字典遞歸併設置

EYE 
COURSES 
CLASS_0E 
CLASS_0F 
EYE|MIT 
COURSES 
CLASS_1E 
CLASS_2F 
EYE|MIT|NIT 
COURSES 
CLASS_1X 
CLASS_1D 
EYE|MIT|NIT|XXX 
COURSES 
CLASS_4X 
EYE|EDX 
COURSES 
CLASS_9A 
CLASS_9B 

這裏與工作數據集:

SCHOOL = { 
    'EYE': { 
    'COURSES': { 
     'CLASS_0E', 
     'CLASS_0F' 
    }, 
    'EYE|MIT': { 
     'COURSES': { 
     'CLASS_1E', 
     'CLASS_2F' 
     }, 
     'EYE|MIT|NIT': { 
     'COURSES': { 
      'CLASS_1X', 
      'CLASS_1D' 
     }, 
     'EYE|MIT|NIT|XXX': { 
      'COURSES': { 
      'CLASS_4X' 
      } 
     } 
     }, 
     'EYE|EDX': { 
     'COURSES': { 
      'CLASS_9A', 
      'CLASS_9B' 
     } 
     } 
    } 
    } 
} 

這是我到目前爲止已經在做試圖循環但沒有運氣。

from jinja2 import Template 

template = Template(
""" 
    {% for key, value in tree.items() recursive %} 
    {{key}} 
    {% if key == "COURSES" %} 
    COURSES 
    {{loop(value.items())}} 
    {% else %} 
    * GOTO INTO THE NEXT CHILD AND REPEAT THE PROCESS * 
    {% endif %} 
    {% endfor%} 
""") 

print(template.render(tree = SCHOOL)) 

我將如何解決這個的Jinja2遞歸問題?

回答

0

經過一段時間的研究,我找到了答案。

from jinja2 import Template 

template = Template(""" 
{%- macro recurse(n) %} 
    {%- for key, value in n.items() %} 
     {%- if key is not equalto 'COURSES' %} 
      {{key}} 
     {%- endif %} 
     {%- if 'COURSES' in value and value is iterable %} 
      COURSES 
      {%- for item in value['COURSES'] %} 
       {{item}} 
      {%- endfor %} 
     {%- endif %} 
     {%- if value.items is defined %} 
      {{recurse(value)}} 
     {%- endif %} 
    {%- endfor %} 
{%- endmacro %} 
{{ recurse(tree) }} 
""") 

print(template.render(tree=SCHOOL)) 

Jinja模板引擎有很多條件不在python中。但神社關心空格,這樣你就需要格式化上面的代碼是這樣的:

from jinja2 import Template 

template = Template(""" 
{% macro recurse(n) %}{% for key, value in n.items() %}{% if key is not equalto 'COURSES' %}{{key}}{% endif %}{% if 'COURSES' in value and value is iterable %} 
COURSES{% for item in value['COURSES'] %} 
{{item}}{% endfor %}{% endif %}{% if value.items is defined %} 
{{recurse(value)}}{% endif%}{% endfor %}{% endmacro %}{{ recurse(tree) }} 
""") 

print(template.render(tree=SCHOOL)) 

這會給我下面的輸出我需要:

EYE 
COURSES 
CLASS_0E 
CLASS_0F 
EYE|MIT 
COURSES 
CLASS_1E 
CLASS_2F 
EYE|MIT|NIT 
COURSES 
CLASS_1X 
CLASS_1D 
EYE|MIT|NIT|XXX 
COURSES 
CLASS_4X 
EYE|EDX 
COURSES 
CLASS_9B 
CLASS_9A