Усечение HTML Django

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

Как я могу это достичь?

Ответ 1

Лучше всего написать собственный фильтр. Вы можете взять исходный код для truncatewords_html и использовать его в качестве шаблона для своего фильтра. Чтобы получить то, что вы хотите, потребуется несколько изменений, и вам просто нужно будет зарегистрировать свой шаблон и убедиться, что вы загрузите его на страницу, на которой вы хотите использовать его, и вы должны быть хорошими.

Смотрите эту страницу для получения дополнительной информации https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

https://code.djangoproject.com/browser/django/trunk/django/template/defaultfilters.py#L288

Вы должны иметь возможность скопировать метод и просто изменить код на это.

return Truncator(value).words(length, html=True, truncate=' see more')

Вы хотите сделать ссылку "см. больше" ссылкой, которая займет больше кода. Я бы изменил фильтр, чтобы принять еще один параметр, который является ссылкой для "see more".

Затем вместо того, чтобы просто "видеть больше" передано в Truncator, вы передадите ссылку HTML.

Ответ 2

Если вы хотите передать пользовательскую ссылку, это можно сделать следующим образом.

Определите свой настраиваемый фильтр:

from django import template
from django.utils.safestring import mark_safe
from django.utils.text import truncate_html_words

register = template.Library()

@register.filter
def truncatewords_html_with_link(value, arg):
    """
    Truncates HTML after a certain number of words and concatenates a link

    Argument: String - Number of words to truncate after and the link, 
    separated by a comma
    """    
    arg_list = arg.split(',')
    try:
        length = int(arg_list[0])
    except ValueError:
        return value
    return mark_safe(truncate_html_words(value, length, arg_list[1]))

Вызвать его из шаблона:

{{ text|truncatewords_html_with_link:"5, <a class=\"read-more\" href=\"/your_url/\">Read More</a>" }}

Ответ 3

Соответствующий код в Django 1.8 гласит:

truncate = pgettext(
    'String to return when truncating text',
    '%(truncated_text)s...')

Если вы используете LOCALE и файлы перевода, поместите в свои файлы *.po следующее:

msgid "String to return when truncating text"
msgstr "Short version: %(truncated_text)s <a class='see-more-link'>see more</a>"

Хотя, в зависимости от того, что должно произойти, когда вы нажимаете ссылку, добавляя ее таким образом, может быть не очень полезно. Вы можете использовать для этого другой заполнитель, но тогда вам нужно будет заменить местозаполнитель, если эта строка сообщения будет использована.