This is a custom template filter that allows you to truncate a string to a maximum of num characters, but respecting word boundaries. So, for example, if string = "This is a test string."
, then {{ string|truncatechars:12 }}
would give you "This is a..." instead of "This is a te".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | from django.template import Library
from django.utils.encoding import force_unicode
from django.utils.functional import allow_lazy
from django.template.defaultfilters import stringfilter
register = Library()
def truncate_chars(s, num):
"""
Template filter to truncate a string to at most num characters respecting word
boundaries.
"""
s = force_unicode(s)
length = int(num)
if len(s) > length:
length = length - 3
if s[length-1] == ' ' or s[length] == ' ':
s = s[:length].strip()
else:
words = s[:length].split()
if len(words) > 1:
del words[-1]
s = u' '.join(words)
s += '...'
return s
truncate_chars = allow_lazy(truncate_chars, unicode)
def truncatechars(value, arg):
"""
Truncates a string after a certain number of characters, but respects word boundaries.
Argument: Number of characters to truncate after.
"""
try:
length = int(arg)
except ValueError: # If the argument is not a valid integer.
return value # Fail silently.
return truncate_chars(value, length)
truncatechars.is_safe = True
truncatechars = stringfilter(truncatechars)
register.filter(truncatechars)
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 2 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 6 months ago
Comments
Truncate words will give you 'n' words regardless of length. Often when you want to truncate you will be working with a character limit rather than a word limit.
Truncating just characters is ugly because you end up with partial words - what this filter does is truncate characters but ensure you only get whole words.
#
Please login first before commenting.