Django 템플릿에서 기본 제공하는 필터 외에도 우리만의 커스텀 필터가 필요할 때가 있습니다.
오늘은 검색어 하이라이트 기능을 예시로 커스텀 템플릿 필터를 만드는 방법을 알아보겠습니다.
먼저 Django 앱 디렉토리 안에 templatetags
패키지를 생성해야 합니다:
myapp/
├── __init__.py
├── models.py
├── views.py
├── templatetags/ # 새로 생성
│ ├── __init__.py # 빈 파일
│ └── custom_filters.py
└── templates/
custom_filters.py
파일에 커스텀 필터를 작성합니다:
from django import template
from django.utils.safestring import mark_safe
import re
# 템플릿 라이브러리 생성
register = template.Library()
@register.filter
def highlight(text, search):
"""
텍스트 내의 검색어를 하이라이트 처리하는 필터
Args:
text: 원본 텍스트
search: 검색어
Returns:
검색어가 <strong> 태그로 감싸진 텍스트
"""
if not search or not text:
return text
# 특수문자 이스케이프 처리
search = re.escape(search)
# 대소문자 구분 없이 검색어 찾기
pattern = re.compile(f'({search})', re.IGNORECASE)
# 검색어를 <strong> 태그로 감싸기
highlighted = pattern.sub(r'<strong>\\1</strong>', str(text))
# HTML 안전하게 반환
return mark_safe(highlighted)
커스텀 필터를 사용하려면 해당 앱이 INSTALLED_APPS
에 등록되어 있어야 합니다:
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
...
'myapp', # 여기에 앱이 등록되어 있어야 함
]
이제 템플릿에서 새로운 커스텀 필터를 사용할 수 있습니다:
{% extends 'base.html' %}
{% load custom_filters %} {# 커스텀 필터 로드 #}
{% block content %}
<h1>{{ title|highlight:search_keyword }}</h1>
<p>{{ content|highlight:search_keyword }}</p>
{% endblock %}
@register.filter
def lower_with_underline(value):
return f"_{str(value).lower()}_"
@register.filter
def replace_with(value, arg):
return str(value).replace(arg, '***')
@register.filter
def is_even(value):
return int(value) % 2 == 0
{{ value|filter }}
){% tag %}
)mark_safe()
는 신중하게 사용해야 함검색 결과 페이지에서 검색어 하이라이트 적용:
{# search_results.html #}
{% load custom_filters %}
<div class="search-results">
{% for result in results %}
<div class="result-item">
<h3>{{ result.title|highlight:search_query }}</h3>
<p>{{ result.description|highlight:search_query }}</p>
</div>
{% endfor %}
</div>
커스텀 템플릿 필터를 사용하면 템플릿에서 반복되는 로직을 깔끔하게 처리할 수 있습니다.
하지만 너무 복잡한 로직은 뷰나 모델에서 처리하는 것이 좋습니다.
필터는 간단한 텍스트 변환이나 포맷팅에 가장 적합합니다.