• 회원가입
  • 로그인
  • 구글아이디로 로그인

[structures] Jinja - for 반복문 (= for반복문 = 포반복문/포문)

목차
  1. for 예제 - users 변수에 담긴 회원 리스트 표시
  2. for 예제 - items() 필터 (= dict 자료형의 키/값 표시)
  3. for 예제 - dictsort() 필터 (= dict 자료형의 키/값 정렬)
  4. for 반복문 안에서 사용 가능한 특수변수 목록 ★
  5. for 예제 - loop.cycle() (= 교대 순환)
  6. for 예제 - if not (= 특정값일 때 반복 건너띄기)
  7. for 예제 - else (= 반복 안 될 때 기본 블럭 표시)
  8. for 예제 - recursive (= 재귀반복문 생성)
  9. for 예제 - loop.previtem / loop.nextitem (= 이전/이후 아이템)
  10. for 예제 - loop.changed() (= 값 변동 여부 확인)
  11. for 예제 - 문자열을 지정 길이 단위로 쪼갠 후 변수에 할당해 출력

 

for 예제 - users 변수에 담긴 회원 리스트 표시


<h1>회원목록</h1>

<ul>

{% for user in users %}

  <li>{{ user.username|e }}</li>

{% endfor %}

</ul>

 

 

for 예제 - items() 필터 (= dict 자료형의 키/값 표시)

템플릿의 변수는 객체 속성을 유지하므로 dict와 같은 컨테이너를 반복 가능함.

 

<dl>

{% for key, value in my_dict.items() %}

    <dt>{{ key|e }}</dt>

    <dd>{{ value|e }}</dd>

{% endfor %}

</dl>


 

for 예제 - dictsort() 필터 (= dict 자료형의 키/값 정렬)

Python dicts는 표시하려는 순서가 아닐 수 있음. 순서가 중요한 경우 |dictsort필터를 사용.

 

<dl>

{% for key, value in my_dict | dictsort %}

    <dt>{{ key|e }}</dt>

    <dd>{{ value|e }}</dd>

{% endfor %}

</dl>

 

 

for 반복문 안에서 사용 가능한 특수변수 목록 ★

 

  • loop.index - 반복문의 반복 순번. (1부터 시작)
  • loop.index0 -반복문의 반복 순번. (0부터 시작)
  • loop.revindex - 반복문 끝에서부터의 순번. (1부터 시작)
  • loop.revindex0 - 반복문 끝에서부터의 순번. (0부터 시작)
  • loop.first - 첫 번째 반복이면 True.
  • loop.last - 마지막 반복이면 True.
  • loop.length - 시퀀스 내 아이템 개수.
  • loop.cycle - 시퀀스 목록 간 순환하는 보조함수. 아래 설명 참조.
  • loop.depth - 재귀 반복문에서 현재 렌더링이 진행 중인 깊이 표시. (1부터 시작)
  • loop.depth0 - 재귀 반복문에서 현재 렌더링이 진행 중인 깊이 표시. (0부터 시작)
  • loop.previtem - 이전 반복의 아이템. (첫 번째 반복 중에는 Undefined.)
  • loop.nextitem - 다음 반복의 아이템. (마지막 반복 중에는 Undefined.)
  • loop.changed(*val) - 이전에 다른 값으로 호출된 경우(또는 전혀 호출 안 된 경우)에 참(true) 반환하는 보조함수.

 

 

for 예제 - loop.cycle() (= 교대 순환)

for 반복문 안에서 특수 loop.cycle 보조함수 사용해 반복 통해 매번 문자열/변수 목록 간 순환 가능.

 

{% for row in rows %}

    <li class="{{ loop.cycle('odd', 'even') }}">{{ row }}</li>

{% endfor %}

 


PS.

Jinja 2.1부터 루프 해제 순환을 허용하는 추가 순환 도우미가 존재함. 자세한 내용은 전역함수 목록을 참조.

 

 

for 예제 - if not (= 특정값일 때 반복 건너띄기)

Python과 달리 반복문을 중단(break)하거나 건너뛰기(continue) 할 수 없음. 그러나 반복 중에 if not 이용해 시퀀스를 필터링해서 아이템 건너뛰기 가능함. (예) hidden 속성의 사용자 건너뛰기 경우.

 

{% for user in users if not user.hidden %}

    <li>{{ user.username|e }}</li>

{% endfor %}

 

 

for 예제 - else (= 반복 안 될 때 기본 블럭 표시)

시퀀스가 비어 있거나 필터링으로 인해 시퀀스의 모든 항목이 제거되어 반복이 발생 않는 경우 else 사용해 기본 블록을 렌더링 가능.

 

<ul>

{% for user in users %}

    <li>{{ user.username|e }}</li>

{% else %}

    <li><em>사용자 없음.</em></li>

{% endfor %}

</ul>

 


PS.

Python에서는 해당 반복이 중단(break) 안 될 때마다 else 블록이 실행됨. Jinja 루프는 중단 안 되므로 else 키워드의 약간 다른 동작이 선택됨.

 

 

for 예제 - recursive (= 재귀반복문 생성)

반복을 재귀적으로 사용하는 것도 가능함. 이는 사이트맵이나 RDFa와 같은 재귀 데이터를 처리하는 경우 유용함. 반복을 재귀적으로 사용하려면 기본적으로 반복문 정의에 recursive 수정자를 추가하고 재귀하려는 새 반복항목을 loop 보조함수로 호출해야 함. (예) 재귀 반복 사용해 사이트맵 구현.

<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>

 


PS.

  • loop 변수는 항상 가장 가까운(가장 안쪽) 루프를 참조함. 반복 수준이 두 개 이상인 경우 재귀적으로 사용하려는 반복 뒤에 {% set outer_loop = loop %} 작성해 변수 loop를 다시 바인딩 가능함. 그런 다음 {{ outer_loop(...) }} 사용해 호출 가능함.
  • 반복문에서 할당(assignments)은 반복이 끝나면 지워지며 반복 범위보다 오래 지속될 수 없음. 이전 버전의 Jinja에는 일부 상황에서 할당이 작동하는 것처럼 보이는 버그가 있었음. 이는 지원되지 않음. 이 문제 처리 방법에 대한 자세한 내용은 Assignments (할당) 참조.

 

 

for 예제 - loop.previtem / loop.nextitem (= 이전/이후 아이템)

마지막 반복 이후 일부 값이 변경되었는지 또는 다음 반복에서 변경될 것인지 확인하려는 경우 loop.previtemloop.nextitem 변수를 사용 가능.

 

{% for value in values %}

    {% if loop.previtem is defined and value > loop.previtem %}

        The value just increased!

    {% endif %}

    {{ value }}

    {% if loop.nextitem is defined and loop.nextitem > value %}

        The value will increase even more!

    {% endif %}

{% endfor %}

 

 

for 예제 - loop.changed() (= 값 변동 여부 확인)

값 변동 여부만 확인하려면, loop.changed 보조함수 사용.

 

{% for entry in entries %}

    {% if loop.changed(entry.category) %}

        <h2>{{ entry.category }}</h2>

    {% endif %}

    <p>{{ entry.message }}</p>

{% endfor %}

 

 

for 예제 - 문자열을 지정 길이 단위로 쪼갠 후 변수에 할당해 출력

[방법1] - 수동할당

 

{% set str = "CSSPHPSQL" %}

{% set A = str[:3] %}

{% set B = str[3:6] %}

{% set C = str[6:] %}

 

A: {{ A }} {# CSS #}

B: {{ B }} {# PHP #}

C: {{ C }} {# SQL #}

 


[예제2] - for 반복문 이용해 자동 할당

 

{% set str = "CSSPHPSQL" %}

{% set width = 3 %}


{% set lang = [] %}

{% for i in range(0, str|length, width) %}

    {% set _ = lang.append(str[i:i+width]) %}

{% endfor %}


{% set A = lang[0] %}

{% set B = lang[1] %}

{% set C = lang[2] %}


A: {{ A }} {# CSS #}

B: {{ B }} {# PHP #}

C: {{ C }} {# SQL #}

 

PS. 순수한 Jinja 코드는 아님. 파이썬 코드 활용.

공식 매뉴얼: https://jinja.palletsprojects.com/en/3.1.x/templates/#for

방문 감사합니다. (즐겨찾기 등록: Ctrl + D)

분류 제목
structures Jinja - for 반복문 (= for반복문 = 포반복문/포문)
structures Jinja - if 조건문 (= if조건문 = 이프조건문/이프문)
structures Jinja - macro (매크로)
structures Jinja - call (콜블럭) ※ caller함수 = 콜러함수
structures Jinja - filter (필터섹션)
structures Jinja - Assignments (할당) ※ set태그 = 셋태그 ※ namespace (네임스페이스) …
structures Jinja - Block Assignments (블럭 할당)
structures Jinja - extends (익스텐드: 상속/확장)
structures Jinja - Blocks (블록)
structures Jinja - include (인클루드: 삽입하기)
structures Jinja - import (임포트: 가져오기)
목록
찾아주셔서 감사합니다. Since 2012