保留未定义的变量
问题描述
我感兴趣的是分多个步骤呈现模板,或者在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>
这是预期的结果。
希望它能有所帮助。此解决方案不适用于列表,但我认为可以扩展该解决方案。如果需要,您还可以获取缺少的字段列表。
相关文章