Jinja: {% call %} λ‚΄μ—μ„œ {{ caller() }} μ‚¬μš© μ‹€νŒ¨

에 λ§Œλ“  2014λ…„ 09μ›” 23일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: pallets/jinja

_처음 λ¬Έμ œκ°€ λ°œμƒν•œ μ‹€μ œ ν…œν”Œλ¦Ώμ€ 더 μƒμš©κ΅¬ κ°™μ•˜μ§€λ§Œ 이 ν…œν”Œλ¦Ώμ€ 문제λ₯Ό 보닀 직관적인 λ°©μ‹μœΌλ‘œ μ„€λͺ…ν•©λ‹ˆλ‹€._

λ‹€μŒ ν…œν”Œλ¦Ώμ΄ μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

{%- macro _tag(tag, id=none, classes=(), attrs={}) -%}
  <{{ tag }}
      {% if id %} id="{{ id }}" {% endif %}
      {% if classes %} class="{{ classes|join(' ') }}" {% endif %}
      {{ attrs|xmlattr }}>
    {% if caller %} {{ caller() }} {% endif %}
  </{{ tag }}>
{%- endmacro -%}

νŠΉμ • κ²½μš°μ— {% call %} λ₯Ό μ‹œλ„ν•˜λŠ” μƒμœ„ 레벨 ν…œν”Œλ¦Ώκ³Ό ν•¨κ»˜:

{%- macro _div() -%}
  {% call _tag('div', *varargs, **kwargs) %}
    {% autoescape false %}
      {% if caller %} {{ caller() }} {% endif %}
    {% endautoescape %}
  {% endcall %}
{%- endmacro -%}

μ§κ΄€μ μœΌλ‘œ {% call _div(...) %} <b>foo</b> {% endcall %} λ₯Ό ν•˜λ©΄ <b>foo</b> λ₯Ό _tag λ§€ν¬λ‘œμ— 전달해야 ν•©λ‹ˆλ‹€. 그러면 λ§€ν¬λ‘œκ°€ λ Œλ”λ§ν•©λ‹ˆλ‹€(μžλ™ μ΄μŠ€μΌ€μ΄ν”„ 덕뢄에 말 κ·ΈλŒ€λ‘œ). κ·ΈλŸ¬λ‚˜ μ‹€μ œ κ²°κ³ΌλŠ” UndefinedError: No caller defined $8$#$ λ‚΄λΆ€μ˜ {{ caller() }} ν–‰μ—μ„œ _div μž…λ‹ˆλ‹€. caller {% call %} λΈ”λ‘μœΌλ‘œ ν™•μž₯λ˜μ§€ μ•Šμ•„ μœ„μ—μ„œ μ„€λͺ…ν•œ 것과 같은 연쇄 ν˜ΈμΆœμ„ λ°©μ§€ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

2.8의 μƒˆλ‘œμš΄ 블둝 ν• λ‹Ή κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” μΆ”μ•…ν•œ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆλ‹€.

{%- macro _div() -%}
  {% set content %}
    {% if caller %} {{ caller() }} {% endif %}
  {% endset %}
  {% call _tag('div', *varargs, **kwargs) %}
    {% autoescape false %} {{ content }} {% endautoescape %}
  {% endcall %}
{%- endmacro -%}

κ·ΈλŸ¬λ‚˜ λ¬Όλ‘  μ›λž˜ 버전이 훨씬 더 λ°”λžŒμ§ν•  κ²ƒμž…λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

ν•΄κ²° 방법에 λŒ€ν•œ μž‘μ€ μ°Έκ³  사항:

2.8의 μƒˆλ‘œμš΄ κΈ°λŠ₯도 μ œλŒ€λ‘œ μž‘λ™ν•˜λ―€λ‘œ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

{% macro a() %}
  start of a
  {% set content=caller() %}
  {% call b() %}
    {{ content }}
  {% endcall %}
  end of a
{% endmacro %}

{% macro b() %}
  start of b
  {{ caller() }}
  end of b
{% endmacro %}

{% call b() %}
 inside b only
{% endcall %}

{% call a() %}
  inside a
{% endcall %}

λͺ¨λ“  5 λŒ“κΈ€

이 μž‘μ€ 예λ₯Ό 톡해 이것을 μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

{% macro a() %}
  start of a
  {% call b() %}
    {{ caller() }}
  {% endcall %}
  end of a
{% endmacro %}

{% macro b() %}
  start of b
  {{ caller() }}
  end of b
{% endmacro %}

{% call b() %}
 inside b only
{% endcall %}

{#
{% call a() %}
  inside a
{% endcall %}
#}

이것은 μžˆλŠ” κ·ΈλŒ€λ‘œ 잘 μž‘λ™ν•˜λ©° λ§ˆμ§€λ§‰ 블둝이 주석 μ²˜λ¦¬λ˜μ§€ μ•Šμ„ λ•Œ λ‹€μŒκ³Ό 같은 역좔적을 μ–»μŠ΅λ‹ˆλ‹€.

Traceback (most recent call last):
  ...
  File "/usr/lib/python2.7/dist-packages/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "templates/test.j2", line 19, in top-level template code
    {% call a() %}
  File "templates/test.j2", line 3, in template
    {% call b() %}
  File "templates/test.j2", line 11, in template
    {{ caller() }}
  File "templates/test.j2", line 4, in template
    {{ caller() }}
jinja2.exceptions.UndefinedError: No caller defined

ν•΄κ²° 방법에 λŒ€ν•œ μž‘μ€ μ°Έκ³  사항:

2.8의 μƒˆλ‘œμš΄ κΈ°λŠ₯도 μ œλŒ€λ‘œ μž‘λ™ν•˜λ―€λ‘œ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

{% macro a() %}
  start of a
  {% set content=caller() %}
  {% call b() %}
    {{ content }}
  {% endcall %}
  end of a
{% endmacro %}

{% macro b() %}
  start of b
  {{ caller() }}
  end of b
{% endmacro %}

{% call b() %}
 inside b only
{% endcall %}

{% call a() %}
  inside a
{% endcall %}

이것은 항상 κ°€μž₯ κ°€κΉŒμš΄ 맀크둜둜 λ²”μœ„λ₯Ό μ§€μ •ν•˜κΈ° λ•Œλ¬Έμ— μΌμ’…μ˜ μ˜λ„μ μž…λ‹ˆλ‹€. wontfix둜 λ‹«μŠ΅λ‹ˆλ‹€.

참고둜 {% set caller_ = caller %} 도 잘 μž‘λ™ν•˜λ―€λ‘œ ν•„μš”ν•  λ•Œλ§ˆλ‹€ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ–΄μ¨Œλ“  이것은 FAQ ν•­λͺ©μ˜ κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 호좜 λΈ”λ‘μœΌλ‘œ μ΄λ™ν•˜κΈ° 전에 {% set caller_ = caller %} κ°€ 도움이 λœλ‹€λŠ” 것을 μ•Œ λ•ŒκΉŒμ§€ μ–Όλ§ˆ 전에 μ •ν™•νžˆ λ™μΌν•œ λ¬Έμ œκ°€ μžˆμ—ˆλ˜ λ™λ£Œλ₯Ό κΈ°μ–΅ν•©λ‹ˆλ‹€.

예, λ¬Έμ„œμ— λ„£κ³  싢을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰