장고 템플릿에서 텍스트 줄이기: truncatechars와 truncatewords 사용법

소요 시간: 5분

Django로 프로젝트 작업을 하면서 한 가지 문제에 부딪혔다. 긴 텍스트가 페이지에 무질서하게 넘쳐나서 레이아웃을 엉망으로 만들고 있었다.

예를 들어 블로그나 뉴스 같은 콘텐츠를 보여줄 때, 요약된 텍스트만 보여주고 나머지는 "더 보기" 버튼을 통해 확인할 수 있게 해야 할 때가 있지 않은가? 그래서 "어떻게 텍스트를 깔끔하게 자를 수 있을까?" 고민을 시작했다.

문득 Django의 템플릿 필터가 떠올랐다. 필터 중에서도 텍스트를 자르는 truncatechars와 truncatewords가 있다는 걸 알게 되었다.


1. truncatechars

truncatechars 필터는 텍스트를 특정 길이만큼 자르는 필터다. 지정된 길이를 초과하면 자동으로 말줄임표(...)가 붙는다. 예를 들어 보자. value라는 변수가 "Hello, Django templates!"라면, 이 필터를 이렇게 사용하면 된다.

<p>{{ value|truncatechars:10 }}</p>

결과는 "Hello, D..."가 된다. 최대 10글자까지만 보여주고 그 이상은 깔끔하게 잘라버린다. 생각보다 너무 간단했다.


2. truncatewords - 단어로 자르기

다음으로는 truncatewords 필터를 살펴봤다. 이 필터는 텍스트를 특정 단어 수만큼 잘라낸다. 이번엔 단어 기준이라, 문장을 조금 더 유연하게 잘라낼 수 있다.

예를 들어 이런 텍스트가 있다고 하자: "Django template filters are useful". 이걸 세 개의 단어로 제한하고 싶다면?

<p>{{ value|truncatewords:3 }}</p>

결과는 "Django template filters..."가 된다. 단어 단위로 잘려서 말줄임표가 붙는 모습이 직관적이면서도 깔끔했다. 게시판이나 요약 내용이 필요한 페이지에 활용하면 아주 유용할 것 같다.


3. 실용적인 활용 예제 - 게시판 목록에서 글 미리보기 제한

이 예제는 블로그 게시판이나 뉴스 목록에서 각 게시글의 요약을 적절하게 보여주고, 필요할 때 "자세히 보기" 버튼으로 전체 글을 확인할 수 있도록 돕는 방법이다. 이를 구현하기 위해 템플릿 필터인 truncatewords를 활용해보자.

{% for post in posts %}
  <h2>{{ post.title }}</h2>
  <p>{{ post.content|truncatewords:20 }}</p>
  <a href="{{ post.get_absolute_url }}">자세히 보기</a>
{% endfor %}

여기서 post.content는 게시글의 본문을 나타낸다. 텍스트를 20개의 단어로 제한하여 미리보기로 표시되며, "자세히 보기" 링크를 통해 전체 글로 이동할 수 있다. 이를 통해 사용자는 모든 내용을 한 번에 보지 않고, 필요한 경우에만 자세히 읽도록 유도할 수 있다.

이 방식은 특히 긴 텍스트가 많은 페이지에서 유용하다. 짧게 요약된 미리보기로 방문자에게 깔끔한 페이지 경험을 제공하면서, 흥미를 유발할 수 있다.


4. 커스텀 필터까지 만들어보기

사실 기본적으로 제공되는 말줄임표(...) 대신 다른 표시를 넣고 싶을 때도 있을 수 있겠다는 생각이 들었다. 그래서 직접 커스텀 필터를 만들어보기로 했다. truncate_custom이라는 이름을 붙여보자.

from django import template

register = template.Library()

@register.filter(name='truncate_custom')
def truncate_custom(value, arg):
    try:
        length = int(arg)
    except ValueError:
        return value
    if len(value) > length:
        return value[:length] + ' (...)'
    return value

이제 HTML 템플릿에서 이렇게 사용하면 된다.

<p>{{ value|truncate_custom:10 }}</p>

결과는 길이를 초과할 경우 (...)로 끝나는 텍스트다. Django 덕분에 필요한 기능을 손쉽게 커스터마이징할 수 있다는 사실에 감탄했다.


truncatechars와 truncatewords는 단순해 보이지만, 텍스트를 다루는 많은 상황에서 강력한 도구가 된다. 

장고 리스트