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

时间:2016-01-29 12:53:47

标签: python django django-templates latex

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

\somevalue{ {{variable}} }

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

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

2 个答案:

答案 0 :(得分:3)

基于谷歌的一些研究,我建议将模板引擎切换到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's switching documentation概述了(少数)语法差异。来自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='#))',

答案 1 :(得分:1)

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

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)

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