2011-12-18 2 views
3

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

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

+0

Возможный дубликат [Как найти, что контент усечен?] (Http://stackoverflow.com/questions/1802625/how-to-find-that-the-content-is-truncated) –

ответ

8

Лучше всего написать собственный фильтр. Вы можете взять исходный код для 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.

+0

Следует отметить что примерный код выше относится к последней версии dev Django, я считаю. Он не будет работать с 1.3.1, поскольку библиотека 'django.utils.text' еще не имеет класса' Truncator'. –

+0

Хорошо, я получил код из багажника, который составляет 1.4 кода, который все еще находится в разработке. –

+0

Мне пришлось дважды проверять - я думал, что на секунду я запускаю старый код. –

1

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

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

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>" }} 
+0

Мне нравится, что вы собрали вместе, но было бы проще, если бы вы просто передали URL-адрес фильтра и позволили фильтру взять ссылку и добавить HTML, просто и идею. –

+0

Да, я думаю, ты прав. Это слишком грязно, пытаясь передать полную ссылку html. Это просто, если вы хотите настроить ссылку «Подробнее». –

+0

Да, я думаю, если вы хотите настроить дополнительную ссылку, вы можете передать ее в качестве второго параметра и по умолчанию ее почитать больше, если не передать ее –

0

Соответствующий код в 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>" 

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