Templates Django: Filtro truncatewords melhorado

O filtro truncatewords do Django pode ter resultados muito diferentes devido à variação da largura das palavras.

Entre “as”, “os” e “es” pode-se ter “paralelepipedos”, “instrumentações” e “inconstitucionais”.

Sei que estou exagerando, de 6 passamos para quase 50 caracteres, mas é só para provar o meu ponto.

Pensando nisso criei um filtro para se usar nos templates do Django. Aí vai:

from django import template

register = template.Library()

@register.filter
def truncatesmart(value, limit=80):
    """
    Truncates a string after a given number of chars keeping whole words.

    Usage:
        {{ string|truncatesmart }}
        {{ string|truncatesmart:50 }}
    """

    try:
        limit = int(limit)
    # invalid literal for int()
    except ValueError:
        # Fail silently.
        return value

    # Make sure it's unicode
    value = unicode(value)

    # Return the string itself if length is smaller or equal to the limit
    if len(value) <= limit:
        return value

    # Cut the string
    value = value[:limit]

    # Break into words and remove the last
    words = value.split(' ')[:-1]

    # Join the words and return
    return ' '.join(words) + '...'

Postei também no Django Snippets: Truncate string after a given number of chars keeping whole words.

Para usar este filtro no seu projeto basta colocar o código acima em um arquivo “.py” dentro do diretório “templatetags” de alguma aplicação e habilitar a aplicação no settings.py do seu projeto. Exemplo da estrutura de arquivos:

  • projeto
    • app
      • templatetags
        • __init__.py
        • app_tags.py
      • __init__.py
      • views.py
      • models.py
    • __init__.py
    • settings.py

No seu template, você precisa chamar a biblioteca de tags recém-criada (app_tags.py) e aí é só usar o filtro:

{% load app_tags %}
{{ string|truncatesmart:50 }}

Para mais informações, veja a documentação sobre como criar suas templatetags e filtros.

[Update em 07/01/2009] Adicionadas instruções sobre como utilizar o filtro no seu projeto, a pedidos de Lucas Max (valeu Lucas).

About these ads

Sobre Rico
Web developer e surfista de verão.

7 Responses to Templates Django: Filtro truncatewords melhorado

  1. Lucas Max disse:

    Opa!
    Queria saber com você como faço para adicionar esse filtro ao meu projeto!
    Valeu, Att,

    Max

    • Rico disse:

      Fala Lucas!
      Atualizei o artigo, deixei o código mais completo e dei as dicas que faltavam, qualquer coisa estamos aí.
      Abraço.

  2. Lucas Max disse:

    Caraaaaaaa,
    showww! amanhã de manhã testo e concerteza já passo a usar seu filtro, eu também tinha visto essa deficiência no truncatewords mas não fazia nem idéia de como concertar, super iniciativa essa sua…
    valeu mesmo, um abraço.

    Max

  3. Thanks a lot! \o/
    Eu fiz uma função parecida em php em um projeto que estava mexendo, mas nada se compara com a facilidade desse seu filtro melhorado!

    Jóia! ;D

  4. Rico disse:

    Legal Vinícius, eu também usava algo parecido no PHP.
    Que bom que lhe serviu!
    Obrigado por compartilhar!

  5. Pingback: salsotto.com » difundindo idéias na web » Truncate de strings no Django

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d blogueiros gostam disto: