我正在编写一些基本上实现一些常见网格布局的Jinja2模板。我希望能够在Pylons应用程序和Django应用程序之间共享这个模板库。
我遇到了一个小绊脚石,因为Django的模板上下文可以从模板的“顶层”访问,而Pylons将你的上下文包装在本地线程c
(或tmpl_context
)变量。
以下是一些证明这一点的类似例子。
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
但这感觉不对。有人看到其他替代方案吗?
由于
答案 0 :(得分:1)
您的Pylons版本有多久? render
似乎已弃用render_jinja2
。当然,Jinja2 documentation将其标记为render_jinja
,Pylons 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,因此无法测试我的任何建议。