保留未定义的变量

2022-02-27 00:00:00 python jinja2 undefined

问题描述

我感兴趣的是分多个步骤呈现模板,或者在JJIA2中保留未定义变量的标记。我相信这不仅意味着创建"UnfinedSilent";"类(这样模板就不会在缺少数据时崩溃),而且如果缺少标记,还会保留具有适当变量名的标记。

示例: 假设上下文中包含Name=";Test";,但缺少数量。

赠送以下模板:

<p>{{name}} has {{quantity}}</p>

呈现后,我需要模板变为:

<p>test has {{quantity}}</p>

有人知道这是否可以实现吗?


解决方案

我也看到了同样的行为。库jinja2schema提供模板所需的变量架构。

我的解决方案的步骤如下:

  • 有模板
  • 获取架构结构
  • 提供一些要填写的数据
  • 用原始字符串填充缺失项目的完整de数据
from jinja2 import Template
import jinja2schema

def assign(schema, data, root=''):
    '''Returns a corrected data with untouched missing fields

    '''

    out = {}
    for key in schema.keys():

        if isinstance(schema[key], (str, jinja2schema.model.Scalar)): 
            try:
                out[key] = data[key]
            except:
                out[key] = f'{{{{ {root+key} }}}}'

        elif isinstance(schema[key], (dict, jinja2schema.model.Dictionary)):
            out[key]={}
            try:
                data[key]
            except:
                data[key] = {}
            out[key] = assign(schema[key], data[key], root+key+'.')

    return out

# original template
template_str = '<p>{{name}} has {{quantity}}</p>'
# read schema
schema = jinja2schema.infer(template_str)
# available data
data = {'name':'test'}
# data autocompleted
data_corrected = assign(schema, data)
# render
template = Template(template_str)
print(template.render(data_corrected))

输出为

<p>test has {{ quantity }}</p>

这是预期的结果。

希望它能有所帮助。此解决方案不适用于列表,但我认为可以扩展该解决方案。如果需要,您还可以获取缺少的字段列表。

相关文章