1. 코드 블록 내에서 변수에 값을 할당할 수도 있음. 최상위 수준('블록, 매크로 또는 루프'의 외부)의 할당은 최상위 매크로와 마찬가지로 템플릿에서 내보내기(export)되며, 다른 템플릿에서 가져오기(import) 가능함.
2. 할당은 set 태그 사용하며, 여러 대상을 가질 수 있음.
(예제1)
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
Navigation:
{% for item in navigation %}
<a href="{{ item[0] }}">{{ item[1] }}</a>
{% endfor %}
(예제2)
{% set key, value = "도메인","Homzzang.com" %}
{{ key }}: {{ value }}
PS. 예제2에 대한 공식 매뉴얼의 예제: {% set key, value = call_something() %}
할당에서 범위 동작 방식
1. 블록 내부에 변수를 설정하고 블록 외부에 표시되도록 하는 것은 불가능하다는 점을 명심. 이는 루프에도 적용됨. 해당 규칙의 유일한 예외는 범위를 도입하지 않는 if 문임. 결과적으로, 다음 템플릿은 예상(= 숫자만 출력)한 대로 작동하지 않음. 즉, did not iterate 값도 출력돼버림.
{% set seq = [1, 2, 3, 4, 5] %}
{% set iterated = false %}
{% for item in seq %}
{{ item }}
{% set iterated = true %}
{% endfor %}
{% if not iterated %} did not iterate {% endif %}
결과값: 1 2 3 4 5 did not iterate
2. Jinja 구문으로는 이 작업을 수행할 수 없음. 대신 루프 else 블록이나 특수 loop 변수와 같은 대체 구성을 사용.
{% set seq = [1, 2, 3, 4, 5] %}
{% for item in seq %}
{{ item }}
{% else %}
did not iterate
{% endfor %}
결과값: 1 2 3 4 5
3. Jinja 2.10 버전부터는 범위 전체에 변경 사항을 전파(예: for 반복문 내부에서 밖으로 값 전달.)할 수 있는 namespace 객체를 사용해 더 복잡한 사용 사례를 처리 가능.
{% set items = [{'title': 'Item 1', 'check_something': False}, {'title': 'Item 2', 'check_something': True}, {'title': 'Item 3', 'check_something': False}] %}
{% set ns = namespace(found=false) %}
{% for item in items %}
{% if item.check_something() %}
{% set ns.found = true %}
{% endif %}
* {{ item.title }}
{% endfor %}
something 갖은 아이템 발견: {{ ns.found }}
결과값: * Item 1 * Item 2 * Item 3 Found item having something: True
4. set 태그의 obj.attr 표기법은 네임스페이스 객체에만 허용됨. 다른 객체에 속성을 할당하려고 하면 예외(exception) 발생함.
5. Jinja 2.10 - 네임스페이스 객체에 대한 지원이 추가됨.