【问题标题】:django template tag on multiple line多行上的django模板标签
【发布时间】:2018-03-05 11:59:03
【问题描述】:

我正在使用这样的代码创建一个自定义 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 %}

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

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

【问题讨论】:

    标签: django


    【解决方案1】:

    不,Django 模板语言不支持多行标签。请参阅ticket 8652,它已作为 WONTFIX 关闭,或来自 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 %}
    

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

    【讨论】:

    • 为了增加答案,您甚至可以使用标签取消多个,以防您的行仍然太长
    • 是的,你可以用标签嵌套多个,但是{% endwith %}{% endwith %}...标签开始看起来有点难看。
    【解决方案2】:

    启用起来非常简单,虽然有点骇人听闻:

    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 左右有效。我应该指出,理论上某些对其参数进行自定义解析的标签可能会损坏;实际上,在过去 10 年的 Django 编程中,我没有遇到任何问题。

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

    【讨论】:

    • 我无法让它在 Django 1.11 上运行。您是否同时想出了一个多行标签的新技巧? :) 谢谢!
    • @VME 让我感到惊讶,因为这个 hack 应用的代码似乎没有改变;确保在解析任何模板之前运行此代码(例如,您可以在 settings.py 的末尾导入它)。
    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2011-02-09
    • 2017-01-05
    • 2012-10-31
    • 2012-11-07
    • 2018-10-21
    • 2014-03-20
    相关资源
    最近更新 更多