【问题标题】:Django templating: wrap first n words of paragraph in tagDjango模板:在标签中包装段落的前n个单词
【发布时间】:2011-01-05 00:50:15
【问题描述】:

使用标准的 Django 模板系统,是否有任何 sn-p/可重用模板标签将一段文本中的前 n 个单词包含在标签中,以便我可以设置它们的样式?

我理想中的寻找:

{{item.description|wrap:"3 span big"}}

哪个输出:

<span class="big">Lorem ipsum dolor</span> sit amet, consectetur adipiscing elit.

如果出于任何原因这不可行或很难获得,我可以使用 JavaScript 并在客户端执行此操作,但我希望能够在页面输出上执行更多操作。

【问题讨论】:

  • 我从来没有听说过这样的事情。你为什么不尝试自己创建一个标签。这很容易。
  • 尝试:{{ item.description.split|slice:":3" }}

标签: django templates django-templates


【解决方案1】:

老实说,我没有对此进行测试,但我想它应该可以工作:

{% with item.description.split as desc %}
    <span class="big">{{ desc|slice:":3"|join:" " }}</span> 
    {{ desc|slice:"3:"|join:" " }} 
{% endwith %}

更新:现在可以使用了

【讨论】:

  • 这个解决方案是“标准 Django 模板系统,<...> sn-p/reusable 模板标签”,完全按照要求(因此可以向设计师建议),而不是作者自己的解决方案,即否则很好。
【解决方案2】:

事实证明,编写过滤器真的很容易(并且完全按照预期的方式工作)。
这可以变得更安全,但可以完成工作(除非有人将 html 作为参数传递,否则不会中断):

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter(name='wrap')
@stringfilter
def wrap(value, arg):
    params = arg.split()
    n = int(params[0])
    tag = params[1]
    tagclass = params[2]
    words = value.split()
    head = ' '.join( words[:n] )
    tail = ' '.join( words[n:] )
    return mark_safe('<%s class="%s">%s</%s> %s' % (tag, tagclass, head, tag, tail))

【讨论】:

    【解决方案3】:

    在视图函数中拆分前 n 个单词有什么问题?

    words = text.split()
    head = ' '.join( words[:3] )
    tail = ' '.join( words[3:] )
    

    您将headtail 提供给模板进行渲染。

    毕竟,这就是视图函数的用途。

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2014-03-20
      相关资源
      最近更新 更多