장고(Django)로 프로젝트를 진행하다 보면 템플릿에서 딕셔너리 데이터를 직접 다루고 싶을 때가 많다. 예를 들어 특정 키에 해당하는 값을 템플릿에서 바로 출력하고 싶지만, 장고 템플릿 시스템은 파이썬 딕셔너리를 완전히 자유롭게 다루도록 설계되어 있지 않다. 이 때문에 view에서 딕셔너리를 구성해 템플릿으로 전달하고, 템플릿에서는 filter를 활용해 key로 값을 가져오는 방식이 자주 사용된다. 이러한 구조가 필요한 이유와 실제 동작 방식을 이해하면 템플릿 처리 흐름을 훨씬 명확하게 파악할 수 있다.
장고 템플릿이 딕셔너리를 바로 처리하지 못하는 이유
장고 템플릿 엔진은 파이썬 코드 실행을 최대한 제한하는 구조로 설계되어 있다. 이는 보안성과 유지보수성을 높이기 위한 장고의 핵심 철학 중 하나다. 템플릿은 로직을 최소화하고, 비즈니스 로직은 view에서 처리하도록 분리하는 것이 장고의 기본 원칙이다. 따라서 템플릿에서 파이썬 딕셔너리를 자유롭게 탐색하거나 복잡한 연산을 수행하는 기능은 기본적으로 제공되지 않는다.
특히 템플릿에서 dict.key 형태로 접근하는 것은 가능해 보이지만, 실제로는 객체 속성 접근 규칙에 따라 동작하기 때문에 딕셔너리의 key를 정확히 처리하지 못하는 경우가 많다. 예를 들어 key가 숫자이거나, 파이썬 예약어이거나, 점 표기법으로 접근할 수 없는 형태라면 템플릿에서 직접 접근이 불가능하다. 이런 제약 때문에 view에서 딕셔너리를 구성해 전달하더라도 템플릿에서 원하는 방식으로 바로 사용할 수 없는 상황이 발생한다.
view에서 딕셔너리를 만들어 전달하는 이유
장고의 권장 방식은 템플릿에서 최소한의 표현만 담당하도록 하고, 데이터 가공은 view에서 처리하는 것이다. 따라서 view에서 필요한 데이터를 딕셔너리 형태로 정리해 context에 담아 템플릿으로 넘기는 방식이 가장 자연스럽다.
예를 들어 다음과 같은 구조를 생각해볼 수 있다.

def my_view(request): data = { ‘apple’: 1000, ‘banana’: 2000, ‘orange’: 1500, } return render(request, ‘page.html’, {‘price_dict’: data})
이렇게 view에서 딕셔너리를 구성해 전달하면 템플릿에서는 이 딕셔너리를 기반으로 필요한 값을 출력할 수 있다. 하지만 템플릿에서 {{ price_dict.apple }}처럼 접근하는 것은 가능해도, 동적으로 key를 지정해야 하는 경우에는 문제가 생긴다. 예를 들어 key가 변수로 주어지는 상황에서는 템플릿에서 직접 접근할 방법이 없다.
filter에서 dict 함수를 만들어 key로 불러오는 이유
이 문제를 해결하기 위해 가장 많이 사용하는 방식이 커스텀 템플릿 필터를 만드는 것이다. 템플릿 필터는 템플릿에서 사용할 수 있는 작은 기능 단위로, 파이썬 코드를 안전하게 감싸 템플릿에서 활용할 수 있도록 해준다.
예를 들어 다음과 같은 필터를 만들 수 있다.

@register.filter def dict_key(d, key): return d.get(key)
이 필터를 사용하면 템플릿에서 다음과 같이 동적으로 key를 지정해 값을 가져올 수 있다.

{{ price_dict|dict_key:fruit_name }}
이 방식이 필요한 이유는 다음과 같다.
- 템플릿에서 파이썬 딕셔너리의 key 접근을 완전히 지원하지 않기 때문이다.
- 템플릿은 로직을 최소화해야 하므로, 복잡한 처리는 필터로 분리하는 것이 장고의 설계 철학에 맞다.
- 필터를 사용하면 템플릿에서 안전하게 딕셔너리 값을 조회할 수 있어 유지보수성이 높아진다.
- key가 변수로 주어지는 상황에서도 유연하게 대응할 수 있다.
정리
장고 템플릿은 보안성과 구조적 안정성을 위해 파이썬 딕셔너리를 직접적으로 다루는 기능을 제한하고 있다. 이 때문에 view에서 딕셔너리를 구성해 전달하고, 템플릿에서는 커스텀 필터를 통해 key로 값을 가져오는 방식이 널리 사용된다. 이러한 구조는 장고의 MVC 패턴을 유지하면서도 템플릿에서 필요한 데이터를 유연하게 처리할 수 있도록 돕는다. 장고 프로젝트를 진행할 때 이 원리를 이해하면 템플릿 처리 흐름을 훨씬 명확하게 설계할 수 있다.