Совместное использование шаблонов Jinja2 между приложениями Pylons и Django - PullRequest
2 голосов
/ 05 июня 2010

Я пишу пару шаблонов Jinja2, которые в основном реализуют некоторые распространенные макеты сетки. Я хотел бы иметь возможность поделиться этой «библиотекой» шаблонов между приложением Pylons и приложением Django.

Я столкнулся с небольшим камнем преткновения в том, что контекст шаблона Django доступен из «верхнего уровня» шаблона, тогда как Pylons оборачивает ваш контекст внутри локальной переменной c (или tmpl_context) потока. 1005 *

Вот несколько аналогичных примеров, демонстрирующих это.

Джанго

from django.shortcuts import render_to_response

ctx = {}
ctx['name'] = 'John'

return render_to_response('hello.html', ctx)

hello.html:

Hello {{ name }}

Пилоны

from pylons import tmpl_context as c
from myapp.lib.base import render

c.name = 'John'
return render('hello.html') 

hello.html:

Hello {{ c.name }}

Я пытаюсь сделать так, чтобы hello.html было одинаковым для обеих платформ.

Один из способов сделать это - обернуть Django render_to_response и сделать что-то вроде этого:

ctx['c'] = ctx

Но это нехорошо. Кто-нибудь видит другие альтернативы этому?

Спасибо

1 Ответ

1 голос
/ 17 июня 2010

Какова ваша версия Pylons? render представляется устаревшим в пользу render_jinja2. Конечно, документация Jinja2 обозначает его как render_jinja, а документация Pylons вообще не показывает его, но исходный код Pylons 1.0 действительно включает это и подразумевает его использование.

Или, если вы застряли с более старой версией Pylons, вы можете использовать тот факт, что настройка c.name такая же, как настройка c.__dict__['name'], и аналогично для всех ее атрибутов. Это позволяет легко установить все атрибуты c, если у вас есть под рукой ctx dict.

ctx = {'name': 'John'}

# Django
from django.shortcuts import render_to_response
render_to_response('hello.html', ctx)

# old Pylons?
from pylons import tmpl_context as c
from pylons.templating import render
c.__dict__.update(ctx)
render('hello.html')

# new Pylons
from pylon.templating import render_jinja2
render_jinja2('hello.html', ctx)

Кроме того, я удивлен, что старые пилоны назвали переменную в шаблоне на основе того, что вы назвали объект, который вы импортировали. Вы уверены, что c не передается в качестве аргумента render?

Отказ от ответственности: у меня не установлены Django или Pylons, поэтому я не могу проверить ни одно из моих предложений.

...