django模板标签在多行上

Eri*_*ric 11 django

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

@register.simple_tag(takes_context=True)
def render_listing(context, *args, **kwargs):
   ... my code ...
Run Code Online (Sandbox Code Playgroud)

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

这工作:

{% render_listing param1=val1 param2=val2 ... paramN=valN %}
Run Code Online (Sandbox Code Playgroud)

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

{% render_listing param1=val1 
                  param2=val2 
                  ... 
                  paramN=valN %}
Run Code Online (Sandbox Code Playgroud)

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

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

Ala*_*air 11

不,Django模板语言不支持多行标记.查看作为WONTFIX关闭的故障单8652,或者来自django-developers邮件列表的此线程.

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

{% render_listing param1=long.common.prefix.val1 param2=long.common.prefix.val2 param2=long.common.prefix.val3 %}
Run Code Online (Sandbox Code Playgroud)

你可以重写为

{% with prefix=long.common.prefix %}
{% render_listing param1=prefix.val1 param2=prefix.val2 param2=prefix.val3 %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

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


Zac*_*now 5

尽管有点黑,但启用起来非常简单:

import re
from django.template import base
base.tag_re = re.compile(base.tag_re.pattern, re.DOTALL)
Run Code Online (Sandbox Code Playgroud)

“使用”很简单;我发现它特别有用的一个地方是{% 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"
%}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @VME 这让我感到惊讶,因为这个黑客应用的代码看起来没有变化;确保在解析任何模板之前运行此代码(例如,您可以在“settings.py”末尾导入它)。 (3认同)