2011-12-09 59 views
8

Tôi đã từ điển sau:vòng lặp đệ quy jinja2 vs điển

{'a': {'b': {'c': {}}}} 

Và mẫu Jinja2 sau:

  {% for key in dictionary recursive %} 

      <li>{{ key }} 
      {% if dictionary[key] %} 
       <ul>{{ loop(dictionary[key]) }}</ul> 
      {% endif %} 
      </li> 

     {% endfor %} 

Nhưng Jinja2 luôn đầu ra:

<ul> 
    <li>a</li> 
    <ul> 
     <li>b</li> 
    </ul> 
</ul> 

hiểu của tôi là bằng cách sử dụng đệ quy, nó sẽ chỉ cho tôi phần tử "c", nhưng nó chỉ hoạt động ở độ sâu 2. Tại sao là dictionary không thay đổi thành dictionary[key] ở mọi vòng lặp lặp lại? dictionary luôn là dictionary gốc.

Trả lời

9

Bạn nói đúng, dictionary không được cập nhật trong các cuộc gọi đệ quy và vòng lặp không thể tiếp tục vì không tìm thấy khóa.

Giải pháp cho vấn đề này chỉ sử dụng các biến được gán trong vòng lặp for. Trong ví dụ điển, điều này có nghĩa để lặp qua các mục của từ điển thay vì chỉ các phím:

from jinja2 import Template 

template = Template("""              
{%- for key, value in dictionary.items() recursive %}      
    <li>{{ key }}                
    {%- if value %}               
     Recursive {{ key }}, {{value}}           
     <ul>{{ loop(value.items())}}</ul>          
    {%- endif %}                
    </li>                  
{%- endfor %}                
""") 

print template.render(dictionary={'a': {'b': {'c': {}}}}) 

Kết quả của kịch bản này là:

<li>a 
    Recursive a, {'b': {'c': {}}} 
    <ul> 
<li>b 
    Recursive b, {'c': {}} 
    <ul> 
<li>c 
</li></ul> 
</li></ul> 
</li> 

nơi bạn có thể thấy rằng đệ quy trên b phím hoạt động tốt vì cả hai keyvalue được cập nhật trên mỗi lần lặp của vòng lặp (tôi đã thêm thông báo "Khóa đệ quy, giá trị" vào mẫu để làm cho nó rõ ràng).

0

thử một cái gì đó như thế này:

{% for key in dictionary recursive %} 

     <li>{{ key }} 
     {% if dictionary[key] %} 
      <ul>{{ loop(dictionary[key].keys()) }}</ul> 
     {% endif %} 
     </li> 

    {% endfor %} 

Tôi nghĩ rằng bạn cần phải vượt qua một iterable vào loop() xây dựng.

+0

Vấn đề tương tự vẫn tiếp tục = ( – Tarantula

Các vấn đề liên quan