Просто все это, кажется, делает то, что вы хотите, и нет никакой зависимости от каких-либо внешних библиотек JS.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не пробовал это в IE, но Chrome и Firefox работают нормально.
from django import template
from django.utils.html import escape
from django.utils.safestring import mark_safe
register = template.Library()
import re
readmore_showscript = ''.join([
"this.parentNode.style.display='none';",
"this.parentNode.parentNode.getElementsByClassName('more')[0].style.display='inline';",
"return false;",
]);
@register.filter
def readmore(txt, showwords=15):
global readmore_showscript
words = re.split(r' ', escape(txt))
if len(words) <= showwords:
return txt
# wrap the more part
words.insert(showwords, '<span class="more" style="display:none;">')
words.append('</span>')
# insert the readmore part
words.insert(showwords, '<span class="readmore">... <a href="#" onclick="')
words.insert(showwords+1, readmore_showscript)
words.insert(showwords+2, '">read more</a>')
words.insert(showwords+3, '</span>')
# Wrap with <p>
words.insert(0, '<p>')
words.append('</p>')
return mark_safe(' '.join(words))
readmore.is_safe = True
Чтобы использовать его, просто создайте папку templatetags в своем приложении, создайте там файл __init__.py
, а затем перетащите этот код в readmore.py
.
Затем в верхней части любого шаблона, где вы хотите его использовать, просто добавьте: {% load readmore %}
Чтобы использовать сам фильтр:
{{ some_long_text_var|readmore:15 }}
: 15 говорит о том, сколько слов вы хотите показать перед ссылкой «читать дальше».
Если вы хотите что-то необычное, например, загрузку полного контента с помощью ajax, это немного отличается и потребует немного больше инфраструктуры.