Шаблоны Django: обернуть первые n слов абзаца в тег - PullRequest
0 голосов
/ 14 января 2010

Используя стандартную систему шаблонов Django, есть ли какой-нибудь фрагмент / повторно используемый тег шаблона, в котором первые n слов в фрагменте текста обернуты в тег, чтобы я мог их стилизовать?

Что я в идеале ищу:

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

который выводит:

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

Если по какой-либо причине это будет неосуществимо или действительно трудно получить, я могу использовать JavaScript и делать это на стороне клиента, но я бы хотел, чтобы больше было возможности сделать это при выводе страницы.

Ответы [ 3 ]

5 голосов
/ 14 января 2010

Если честно, я не проверял это, но думаю, это должно работать:

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

Обновление : теперь работает

2 голосов
/ 14 января 2010

Оказывается, что написать фильтр действительно легко (и работает именно так, как задумано).
Это может быть сделано намного безопаснее, но делает работу (и не сломается, если кто-то не передаст 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))
1 голос
/ 14 января 2010

Что не так с выделением первых n слов в функции просмотра?

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

Вы предоставляете head и tail шаблону для рендеринга.

В конце концов, для этого предназначена функция просмотра.

...