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