The default truncatechars template tag truncates a string if it is longer than the specified number of characters but does so exactly at the character count, irrespective of whether it’s the middle of a word or not.
Here’s a smarter version that clips the text at the word boundary:
from django import template | |
register = template.Library() | |
# truncate chars but leaving last word complete | |
@register.filter(name='smarttruncatechars') | |
def smart_truncate_chars(value, max_length): | |
if len(value) > max_length: | |
# limits the number of characters in value to max_length (blunt cut) | |
truncd_val = value[:max_length] | |
# check if the next upcoming character after the limit is not a space, | |
# in which case it might be a word continuing | |
if value[max_length] != ' ': | |
# rfind will return the last index where matching the searched character, | |
# in this case we are looking for the last space | |
# then we only return the number of character up to that last space | |
truncd_val = truncd_val[:truncd_val.rfind(' ')] | |
return truncd_val + '…' | |
return value |