Templates Django: Filtro truncatewords melhorado
dezembro 23, 2008 7 Comentários
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
- templatetags
- __init__.py
- settings.py
- …
- app
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).







Opa!
Queria saber com você como faço para adicionar esse filtro ao meu projeto!
Valeu, Att,
Max
Fala Lucas!
Atualizei o artigo, deixei o código mais completo e dei as dicas que faltavam, qualquer coisa estamos aí.
Abraço.
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
Legal Lucas, espero que seja útil pra você!
Abraço.
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
Legal Vinícius, eu também usava algo parecido no PHP.
Que bom que lhe serviu!
Obrigado por compartilhar!
Pingback: salsotto.com » difundindo idéias na web » Truncate de strings no Django