Как найти, что контент урезан? - PullRequest
8 голосов
/ 26 ноября 2009

Я пытаюсь создать приложение для блога, и проблема в том, что, когда я использую тег 'truncatewords_html' в своем шаблоне, чтобы обрезать сообщения длиннее, чем указанное количество слов, мне нужно добавить ссылку на полный пост по названию, например «читать дальше». ... 'после усечения. Поэтому я должен знать, что пост был усечен или нет.

П.С .: Это питонский способ решения проблемы?

{% ifequal post.body|length post.body|truncatewords_html:max_words|length %}
  {{ post.body|safe }}
{% else %}
  {{ post.body|truncatewords_html:max_words|safe }}<a href="{{ post.url}}">read more</a>
{% endifequal %}

Ответы [ 4 ]

6 голосов
/ 26 ноября 2009

Это довольно запутанно, но у Джанго есть странные углы. По сути, я понимаю, что если длина строки одинакова, если вы усекаете слова x и x + 1, то строка не усекается ...

{% ifnotequal post.body|truncatewords_html:30|length post.body|truncatewords_html:31|length %}
   <a href="#">read more...</a>
{% endifnotequal %}
2 голосов
/ 26 ноября 2009

Вы можете написать собственный тег шаблона (см. django docs ) или вручную проверить в шаблоне, превышает ли содержимое, которое вы хотите отобразить, заданную длину с помощью length встроенный фильтр.

1 голос
/ 27 ноября 2009

Все сводится к личным предпочтениям, но, на мой вкус, вы слишком много работаете с шаблоном. Я бы создал метод для модели Post, возможно, read_more_needed(), который возвращает True или False в зависимости от длины текста. например:

def read_more_needed(self):
    from django.utils.text import truncate_html_words
    return not truncate_html_words(self.body,30)==truncate_html_words(self.body,31)

Тогда ваш шаблон будет выглядеть так:

{% if post.read_more_needed %}
  {{ post.body|truncatewords_html:30|safe }}<a href="{{ post.url}}">read more</a>
{% else %}
  {{ post.body|safe }}
{% endif %}
0 голосов
/ 26 ноября 2009

Выезд http://code.djangoproject.com/ticket/6799

Этот патч предоставляет метод замены по умолчанию elipses для усеченного текста.

...