【问题标题】:Django template tag to truncate textDjango模板标签截断文本
【发布时间】:2011-07-11 07:06:17
【问题描述】:

Django 有truncatewords 模板标签,它会在给定字数处剪切文本。但是没有像 truncatechars 这样的东西。

在给定的字符长度限制下剪切模板中文本的最佳方法是什么?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    这是最近在 Django 1.4 中添加的。例如:

    {{ value|truncatechars:9 }}
    

    See doc here

    【讨论】:

    • "truncatechars" 也在开发最新的 Django 1.9
    【解决方案2】:
    {{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}
    

    更新

    从 1.4 版开始,Django 有一个 built-in template tag 用于此:

    {{ value|truncatechars:9 }}
    

    【讨论】:

    • 由于我使用的是 pre-1.4 Django,这正是我所需要的。谢谢!
    • truncatechars 过滤器默认添加一个椭圆字符。
    • 在我对 django 的全部知识中,我经常返回此页面以获取我似乎不记得何时要使用它的截断功能,所以它只写评论并为有史以来最伟大的 STF 帖子投上一票^^
    • 再来一张^^
    【解决方案3】:

    我制作了自己的模板过滤器,也将“...”添加到(截断的)字符串的(最后一个单词)的末尾:

    from django import template
    register = template.Library()
    
    @register.filter("truncate_chars")
    def truncate_chars(value, max_length):
        if len(value) > max_length:
            truncd_val = value[:max_length]
            if not len(value) == max_length+1 and value[max_length+1] != " ":
                truncd_val = truncd_val[:truncd_val.rfind(" ")]
            return  truncd_val + "..."
        return value
    

    【讨论】:

    • 它现在是 django 的默认值。
    【解决方案4】:

    如果您更喜欢创建自己的自定义模板标签,请考虑在其中使用 Django util Truncator。以下是一个示例用法:

    >>> from django.utils.text import Truncator
    >>> Truncator("Django template tag to truncate text")
    <Truncator: <function <lambda> at 0x10ff81b18>>
    >>>Truncator("Django template tag to truncate text").words(3)
    u'Django template tag...'
    Truncator("Django template tag to truncate text").words(1)
    u'Django...'
    Truncator("Django template tag to truncate text").chars(20)
    u'Django template t...'
    Truncator("Django template tag to truncate text").chars(10)
    u'Django ...'
    

    然后你可以把它放在一个模板标签中:

    from django import template
    from django.utils.text import Truncator
    
    register = template.Library()
    
    @register.filter("custom_truncator")
    def custom_truncator(value, max_len, trunc_chars=True):
        truncator = Truncator(value)
        return truncator.chars(max_len) if trunc_chars else truncator.words(max_len)
    

    【讨论】:

      【解决方案5】:

      【讨论】:

        【解决方案6】:

        您应该编写一个自定义模板过滤器:http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

        看看truncatewords是如何内置在django.utils.text中的

        【讨论】:

          【解决方案7】:

          您可以使用类似的代码实现您的目标:

          {{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

          NUM_OF_CHARS_TO_TRUNCATE 是要离开的字符数。

          【讨论】:

            【解决方案8】:

            【讨论】:

            • 谢谢,但这不是我所需要的。
            • 怎么样?它可以用来对字符串进行切片。
            • 文档说它是用于列表的。它也不会将“...”附加到截断的文本。
            • 只有在被截断时才需要添加“...”。
            • 这回答了 OP 的问题,这将适用于旧版本的 Django。尽管使用较新的版本 truncatechars 应该是首选,因为它更明确。
            【解决方案9】:

            添加“截断”过滤器是一项 4 年的功能请求,但最终落入主干,据我了解 https://code.djangoproject.com/ticket/5025 - 所以我们必须等待下一个版本或使用主干。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-03-24
              • 1970-01-01
              • 1970-01-01
              • 2020-08-24
              • 1970-01-01
              • 1970-01-01
              • 2012-10-28
              相关资源
              最近更新 更多