2

我正在编写几个 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)

你好.html:

Hello {{ name }}

塔架

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

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

你好.html:

Hello {{ c.name }}

我想要做的是让它hello.html在两个框架中都是一样的。

我看到的一种方法是包装 Djangorender_to_response并执行以下操作:

ctx['c'] = ctx

但这只是感觉不对。有人看到这个的其他选择吗?

谢谢

4

1 回答 1

1

您的 Pylons 版本过时了吗? render似乎不赞成使用render_jinja2. 诚然,Jinja2 文档错误地将其标记为render_jinja,而Pylons 文档根本没有显示它,但Pylons 1.0 源代码确实包含它并暗示了它的用法。

或者,如果您坚持使用旧版本的 Pylons,您可以利用 settingc.name与 setting 相同的事实c.__dict__['name'],并且其所有属性也类似。如果您手边有 ctx dict,这可以很容易地设置 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,所以我无法测试我的任何建议。

于 2010-06-17T09:22:02.860 回答