变量内容上的Jinja嵌套呈现

2024-04-20 10:21:52 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在一个变量X中有实际的jinja模板代码,我们假设X的内容是{{some{other}。

如何既显示X又呈现其内容?

例如,这不起作用:

{{X}

因为它只是将其呈现为屏幕“{{some{some戋other戋variable}”,而不是某个戋other戋variable的内容。

我这样做的原因是我有一个站点,在这个站点中(受信任的)用户可以创建自己可能包含jinja模板代码的帖子。视图页面显示这些文章,但是由于上述问题,直接呈现它们,而不是像我希望的那样替换变量。


Tags: 代码用户视图模板内容屏幕站点原因
3条回答

我想到了一个有趣的方法:

  • 编字典
  • 把听写加载器包起来(但要保留对字典的引用)
  • 将链式加载器与DictLoader和普通加载器一起传递给环境
  • 实现将其参数添加到上述字典中的自定义筛选器
  • 使用include指令在当前上下文中调用模板代码

还没试过,不过可能会成功!

我找不到一个好的方法来做这个嵌套渲染,但是,我可能会尝试建议一个替代方案:

由于用户创建了posts,我认为“{{some{some{other}variable}”实际上是整个post的子字符串,也是一个字符串。

我会做:

X.replace("{{some_other_variable}}", some_other_variable))

然后按正常返回{{X}。这能满足你的要求吗?

我知道现在有点晚了:)但是这里有一个不影响模板代码的解决方案:

import jinja2
def recursive_render(tpl, values):
     prev = tpl
     while True:
         curr = jinja2.Template(prev).render(**values)
         if curr != prev:
             prev = curr
         else:
             return curr

试运行:

>>> recursive_render("Hello {{X}}!", dict(X="{{name}}", name="world"))
u'Hello world!'

注意,这不是很有效,因为模板必须在每次迭代时从头开始重新解析。

相关问题 更多 >