繁体   English   中英

如何在Django的乳胶模板中正确设置变量

[英]How to properly set variables in a latex template for Django

我想通过django视图创建一个带乳胶的pdf。 我创建了视图并设置了一个乳胶模板,除了一件事,它工作正常。 当我在乳胶模板中放置一个变量时,我必须在花括号周围使用空格,如下所示:

\somevalue{ {{variable}} }

否则django将不会检查它是否为变量。 乳胶语法检查器已经告诉我“Unintendes whitespace around}?!”。 我可以通过我的视图将变量传递给模板,然后创建pdf但是我在插入的文本周围有空格。

有人知道如何解决这个问题吗?

基于谷歌的一些研究,我建议将模板引擎切换到Jinja,后者由Django支持并具有可配置的语法。 请注意,我还没有完全测试过这个。

以下是乳胶模板的外观:

\somevalue{((variable))}

最重要的部分是设置variable_start_stringvariable_end_string选项:

>>> import jinja2
>>> env = jinja2.Environment(variable_start_string='((', variable_end_string='))')
>>> t = env.from_string("\somevalue{((variable))}")
>>> t.render(name='Attention!')
'\\somevalue{Attention!}'

Jinja的转换文档概述了(少数)语法差异。 来自FAQ:

Jinja2的默认语法在很多方面与Django语法相匹配。 但是,这种相似性并不意味着您可以在Jinja2中使用未经修改的Django模板。 例如,过滤器参数使用函数调用语法而不是冒号来分隔过滤器名称和参数。 此外,Jinja中的扩展接口与Django的扩展接口根本不同,这意味着您的自定义标签将不再起作用。

Django 1.9和1.8以及其他版本可能内置了对Jinja的支持。

我没有找到在Django中配置Jinja语法的示例,我目前无法对此进行测试,但我认为您需要根据需要更改TEMPLATES['OPTIONS']字典:

    block_start_string='(#',
    block_end_string='#)',
    variable_start_string='((',
    variable_end_string='))',
    comment_start_string='((#',
    comment_end_string='#))',

我找到的解决方案是在模板渲染后删除多余的空格:

template = select_template(self.get_template_names())
latex_content = template.render(context)
latex_content = re.sub(r'\{ ', '{', latex_content)
latex_content = re.sub(r' \}', '}', latex_content)

这样做的好处是不需要额外的模板标签充斥模板。 然而,这是要求模板编写者了解此行为并在使用花括号的任何地方将其考虑在内的缺点。

实际上,编写一个处理此问题的自定义Template类可能会更好。

编辑

请注意,使用此方法时,没有理由使用空格作为分隔符而不是任何其他字符。 为了使模板编写者/读者更清楚,你可以使用另一个让他响铃的角色。 例如:

template.tex

\somevalue{§{{ variable }}§}

views.py

template = select_template(self.get_template_names())
latex_content = template.render(context)
latex_content = re.sub(r'\{§', '{', latex_content)
latex_content = re.sub(r'§\}', '}', latex_content)

这清楚地表明,如果有空间,则是有意的。 而且我认为已经很清楚§到处都不打算显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM