2010-08-03 3 views

답변

34

기술적으로 컨텍스트가 명명 된 사전으로 전달되지 않기 때문에 템플릿 내부에서 컨텍스트 변수 목록을 생성하려면 약간의 작업이 필요합니다. 그래도 가능합니다.

  1. 본질적으로 전역 변수의 사전이다 jinja2.Context 객체/함수

  2. 글로벌 네임 스페이스의 그 함수를 사용할 수 있도록 반환하는 Jinja context function 정의; 즉 jinja2.Environment 또는 jinja2.Template 전역 사전

  3. 선택적으로 컨텍스트의 개체를 필터링합니다. 예를 들어 callable()을 사용하면 Jinja의 기본 전역 도우미 함수 (범위, 결합 자 등)를 건너 뛸 수 있습니다. 컨텍스트 함수 나 템플릿에서이 작업을 수행 할 수 있습니다. 어디서나 가장 합리적입니다.

예 :

>>> import jinja2 
>>> 
>>> @jinja2.contextfunction 
... def get_context(c): 
...   return c 
... 
>>> tmpl = """ 
... {% for key, value in context().items() %} 
...  {% if not callable(value) %} 
...   {{ key }}:{{ value }} 
...  {% endif %} 
... {% endfor %} 
... """ 
>>> 
>>> template = jinja2.Template(tmpl) 
>>> template.globals['context'] = get_context 
>>> template.globals['callable'] = callable 
>>> 
>>> context = {'a': 1, 'b': 2, 'c': 3} 
>>> 
>>> print(template.render(**context)) 
     a:1 
     c:3 
     b:2 

[또는, 다른 솔루션 작동하도록 ('home.htm', context=context)render_response를 호출합니다. 여기서

+4

감사합니다. 나는 당신의 우수한 Jinja2 지식에 굴복한다. – Christian

+0

'callable' 체크 때문에 솔루션은 명시 적으로 컨텍스트의 일부로 전달 된 함수를 무시합니다. 아마도 자주 발생하지는 않지만 차이를 만들 수 있습니다. –

+1

참. 이 간단한 솔루션을 확실히 향상시킬 수 있습니다. 예를 들어,''template''이 전역 변수 인 경우,''get_context()''는''context''에 기초한''template.globals''에 존재하는 키가없는 새로운 사전을 반환 할 수 있습니다. – Garrett

1

을 어떻게 플라스크 응용 프로그램에서 작업 @crewbum's answer를 얻을 수있다 :

import jinja2 

@jinja2.contextfunction 
def get_context(c): 
    return c 

app.jinja_env.globals['context'] = get_context 
app.jinja_env.globals['callable'] = callable 
+0

어디 넣을까요? – johnny

+0

앱 초기화 (또는 앱 공장). flask-sqlalchemy, flask-login 등과 같은 플라스크 확장을 사용하는 경우, 이는 작성된 위치와 같은 위치에있을 수 있습니다. –

관련 문제