在Pylons和Django应用程序之间共享Jinja2模板

时间:2010-06-04 21:55:05

标签: django pylons jinja2

我正在编写一些基本上实现一些常见网格布局的Jinja2模板。我希望能够在Pylons应用程序和Django应用程序之间共享这个模板库。

我遇到了一个小绊脚石,因为Django的模板上下文可以从模板的“顶层”访问,而Pylons将你的上下文包装在本地线程c(或tmpl_context )变量。

以下是一些证明这一点的类似例子。

Django的

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 个答案:

答案 0 :(得分:1)

您的Pylons版本有多久? render似乎已弃用render_jinja2。当然,Jinja2 documentation将其标记为render_jinjaPylons documentation根本不显示,但Pylons 1.0 source code确实包含了它并暗示其用法。

或者如果您遇到旧版本的Pylons,您可以利用设置c.name与设置c.__dict__['name']相同的事实,以及类似的所有属性。如果您有方便的ctx字典,这可以很容易地设置所有c的属性。

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)

另外,我很惊讶旧Pylons根据您为导入的对象命名的名称在模板中命名变量。你确定c不作为参数传递给render吗?

免责声明:我没有安装Django或Pylons,因此无法测试我的任何建议。