Как узнать, что контент усечен? - программирование

Как узнать, что контент усечен?

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

P.S.: Является ли это питоническим способом решения проблемы?

{% 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 %}
4b9b3361

Ответ 1

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

{% ifnotequal post.body|truncatewords_html:30|length post.body|truncatewords_html:31|length %}
   <a href="#">read more...</a>
{% endifnotequal %}

Ответ 2

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

Ответ 3

Это сводится к личным предпочтениям, но по моему вкусу вы делаете слишком много работы в шаблоне. Я бы создал метод на модели 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 %}

Ответ 4

Отъезд http://code.djangoproject.com/ticket/6799

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