我正在使用Django的内置truncatewords_html过滤器,最后添加“...”,相反,我想用“查看更多”链接替换它。
我怎样才能做到这一点?
答案 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>"
但是,根据您点击链接时应该发生的情况,添加它可能不是很有帮助。你可以使用另一个占位符,但是你必须确保在使用这个消息字符串时替换占位符。