【问题标题】:Sharing Jinja2 templates between Pylons and Django applications在 Pylons 和 Django 应用程序之间共享 Jinja2 模板
【发布时间】:2011-02-28 00:21:49
【问题描述】:

我正在编写几个 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 在两个框架中都相同。

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

ctx['c'] = ctx

但这感觉不对。有人看到这个的其他替代品吗?

谢谢

【问题讨论】:

    标签: django pylons jinja2


    【解决方案1】:

    您的 Pylons 版本过时了吗? render 似乎被render_jinja2 弃用。当然,Jinja2 documentation 错误地将其标记为render_jinja,而Pylons documentation 根本没有显示它,但Pylons 1.0 source code 确实包含它并暗示了它的用法。

    或者,如果您坚持使用旧版本的 Pylons,您可以利用设置 c.name 与设置 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,所以我无法测试我的任何建议。

    【讨论】:

    • 我正在使用 Pylons 1.0。函数myapp.lib.base.render 在后台调用render_jinja2。 Pylons 在我创建项目时生成了这个包装器,我告诉它使用 Jinja2。
    • 另外,Pylons 使模板可以使用tmpl_context(旧版)和c(推荐)的上下文。据我所知,如何将该模块导入控制器并不会真正影响它在模板中的命名方式。它不必作为参数传递,因为 Pylons 使用一些线程本地 voodoo 来使模块级的事情在每个请求的基础上工作。换句话说,我可以将它作为ctx 或我的模块中的任何内容导入,但 Pylons 仍会将其作为tmpl_contextc 提供给我的模板。
    • 我明白了...我想我对 Pylons 代码了解不多。 __dict__.update 有帮助吗?如果您直接拨打render_jinja2 会发生什么?
    • 我有点困惑,因为在某种程度上,Jinja2 确实接受**kwargs,所以必须有办法通过它们而不是通过c。最坏的情况,你可以只使用 Jinja2 API 自己渲染模板,然后手动传递 cc.__dict__ctx 等。
    • 我还没有这样做,但我认为解决方案将涉及调整 Django 端以让上下文处理器执行,然后将生成的上下文作为 @ 提供给模板987654345@ 以便它模仿 Pylons 所做的事情。那就是如果我想继续使用 render_jinja2 原样,它适用于线程本地伏都教。或者,我可以实现我自己的 Pylons 的render_jinja2 版本,它将线程本地上下文直接作为上下文,而不是将其作为ctmpl_context 传递。如果我得到它的工作,我会发布更新。
    猜你喜欢
    • 2011-05-07
    • 2016-02-25
    • 2014-08-23
    • 2012-06-02
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2020-06-08
    相关资源
    最近更新 更多