2011-01-16 3 views
1

Я ищу django templatetag, который будет подсчитывать слова и подстроить целый абзац, не прерывая слов. Есть встроенная функция? Я попытался изучить встроенный список функций в документации по шаблонам Django, но ничего не нашел.django templatetag

Советуем?

ответ

1

Вот моя реализация этого. На самом деле это предложение не абзац, но в любом случае вы должны получить представление.

{% splitarticle some_data word_count %} 
    {{ pre_part }} 
    {% if post_part %} 
     {{ post_part }} 
    {% endif %} 

И он будет возвращать две переменные

И код. Вы должны поместить в < your_app>/templatetags/

from django import template 
from django.utils.encoding import force_unicode 

def split_by_sentence(text, word_count): 
    words = force_unicode(text).strip().split(' ') 
    word_count = int(word_count) 
    if len(words)>word_count: 
     cnt = word_count 
     for word in words[word_count:]: 
      cnt+=1 
      if '.' in word or '?' in word or '!' in word: 
       break 
     if cnt>=len(words): 
      cnt = word_count 

     pre = ' '.join(words[:cnt]) 
     post = ' '.join(words[cnt:]) 
     return pre, post  
    else: 
     return text, None 

register = template.Library() 
@register.tag 
def splitarticle(parser, token): 
    try: 
     tag, data, word_count = token.split_contents() 
    except ValueError: 
     raise template.TemplateSyntaxError('splitarticle parsing error') 
    return SplitArticleNode(data, word_count) 

class SplitArticleNode(template.Node): 
    def __init__(self, data, word_count): 
     self.data = template.Variable(data) 
     self.word_count = word_count 
    def render(self, context): 
     data = self.data.resolve(context) 
     context['pre_part'], context['post_part'] = split_by_sentence(data, self.word_count) 
     return '' 
1

Насколько я знаю, для этого нет встроенного тега. В зависимости от характера слов, которые вы хотите (они не внутри или часть цикла for-loop, хотя даже тогда вы могли бы просто сделать это рекурсивно), вы могли бы просто делать то, что вы хотите в views.py, и передавать результат как переменная к шаблону?

Значит, вы делаете свою подстроку и количество слов в представлениях и передаете ответ шаблону в виде переменной/списка?

0

Я думаю, вам нужен фильтр. До сих пор проверяем документацию шаблона django для фильтра среза https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#slice . Также проверьте там trucatechars и trucatewords фильтры https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#truncatechars, https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#truncatewords. Другим является https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#truncatewords-html, который находится в порядке в html. Все эти фильтры, к сожалению, находятся в разработке версии django

Смежные вопросы