2010-08-03 21 views

cevap

34

Teknik olarak, bağlam adlandırılmış bir sözlük olarak aktarılmadığı için, bir şablonun içinden bağlam değişkenlerinin bir listesini oluşturmak için küçük bir çalışma yapılması gerekir. Yine de mümkündür.

  1. esasen küresel değişkenler sözlüğü jinja2.Context nesnesi,/fonksiyonları

  2. genel ad alanında bu fonksiyon kullanılabilir yapın dönmek için bir Jinja context function tanımlayın; jinja2.Environment ya da jinja2.Template globals sözlüğü

  3. İsteğe bağlı olarak, nesneleri nesnelere göre filtreleyin; Örneğin, Jinja'nın varsayılan global yardım işlevlerini (aralık, marangoz vb.) atlamak için callable() kullanın. Bu bağlam işlevinde veya şablonda yapılabilir; nerede olursa olsun en mantıklı.

Örnek:

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

[Alternatif olarak, diğer çözüm çalışması için ('home.htm', context=context) ile render_response diyoruz.] Burada

+4

Çok teşekkürler. Üstün Jinja2 bilginize yayılıyorum. – Christian

+0

"Callable" denetimi nedeniyle çözümünüzün, içeriğin bir parçası olarak açıkça iletilmiş işlevleri göz ardı edeceğini unutmayın. Muhtemelen sık sık olmaz, ama bir fark yaratabilir. –

+1

Doğru. Bu basit çözüm kesinlikle geliştirilebilir. Örneğin, '' '' '' '' '' 'global'' ise' 'get_context()' '' 'context'' temelli yeni bir sözlük döndürür, ancak' 'template.globals'''da da bulunan anahtarlar olmadan. – Garrett

1

nasıl bir Matara uygulamasından çalışan @crewbum's answer almak için yapılması gerekenler:

import jinja2 

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

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

Bunu nereye koyarsınız? – johnny

+0

Uygulama başlatılırken (veya uygulama fabrikasında). Eğer flask-sqlalchemy, flask-login, vb. Gibi herhangi bir flask uzantısı kullanırsanız, bunlar oluşturuldukları yer ile aynı olabilir. –

İlgili konular