Django HTML截断

时间:2011-12-18 18:27:24

标签: django django-templates

我正在使用Django的内置truncatewords_html过滤器,最后添加“...”,相反,我想用“查看更多”链接替换它。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:9)

最好编写自己的过滤器。您可以获取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')

您想要“查看更多”链接,这将需要更多代码。我会更改过滤器以接受另一个参数,这是“查看更多”的链接。

然后,您可以传递HTML链接,而不只是将“看到更多”传递给Truncator。

答案 1 :(得分: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>" }}

答案 2 :(得分: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>"

但是,根据您点击链接时应该发生的情况,添加它可能不是很有帮助。你可以使用另一个占位符,但是你必须确保在使用这个消息字符串时替换占位符。