django模板标签在多行上

时间:2018-03-05 11:59:04

标签: django

我正在使用这样的代码创建自定义django模板标记:

@register.simple_tag(takes_context=True)
def render_listing(context, *args, **kwargs):
   ... my code ...

这很有效,但在我的模板中,似乎所有参数都必须在一行上,例如:

这有效:

{% render_listing param1=val1 param2=val2 ... paramN=valN %}

但在多行上,它不起作用:

{% render_listing param1=val1 
                  param2=val2 
                  ... 
                  paramN=valN %}

我尝试了多个转义序列,但我没有成功,

有没有办法在多行上指定模板标签?

2 个答案:

答案 0 :(得分:7)

不,Django模板语言不支持多行标记。请参阅已关闭为WONTFIX的ticket 8652或来自django-developers邮件列表的this thread

有时,如果有重复的前缀,您可以使用with标记使其更具可读性。例如,如果你有,

{% render_listing param1=long.common.prefix.val1 param2=long.common.prefix.val2 param2=long.common.prefix.val3 %}

你可以改写为

{% with prefix=long.common.prefix %}
{% render_listing param1=prefix.val1 param2=prefix.val2 param2=prefix.val3 %}
{% endwith %}

通常(但并非总是),一个非常长的标签表明你在模板中放置了太多的逻辑。看看你是否可以将其中的一部分移动到视图,模型方法,模板标签或模板过滤器中。

答案 1 :(得分:4)

启用它非常简单,尽管有点黑:

import re
from django.template import base
base.tag_re = re.compile(base.tag_re.pattern, re.DOTALL)

“使用”很简单;我发现它特别有用的一个地方是{% include %}标签:

{% include 'my/sweet/modal-template.template' with
    message="Hey, do you really want to frob the widget?"
    yes="Heck yes I do!"
    no="No frickin' way!"
    icon="error"
%}

我还没有在Django的最新版本中进行过测试,但是我认为它可以进行修改。至少回到了1.8。我应该指出,从理论上讲,一些对参数进行自定义解析的标签可能会损坏;在实践中,过去十年的Django编程我没有遇到任何麻烦。

参考:http://zachsnow.com/blog/2016/multiline-template-tags-django/