구글링을 해보니 요런 흑마법스러운 팁이 나오기는 하는데 좀더 간단한 방법을 생각해 보았다.
extends 템플릿 태그에 문자열 대신 변수를 넘길 수 있는 점을 이용한 것이다. 먼저, 레이아웃을 조정할 템플릿의 상속 구문을 다음과 같은 형태로 바꾸자.
{% extends base %}
그리고 컨텍스트 처리기를 추가한다. (원하는 위치에 context_processors.py를 만든다)def hijax(request):
return {'base': 'base_xhr.html' if request.is_ajax() else 'base.html'}
이 처리기의 역할은 템플릿의 컨텍스트에다가 XHR을 통한 요청이면 base_xhr.html을, 아니면 base.html을 base 변수에 넣도록 하는 것이다.return {'base': 'base_xhr.html' if request.is_ajax() else 'base.html'}
HttpRequest.is_ajax 메서드는 X-Requested-With 헤더가 XMLHttpRequest인지 확인하는 식으로 작동하므로 이 헤더를 넘겨줘야 한다는 점을 조심해야 한다. 물론 jQuery, Dojo, Prototype 등 널리 쓰이는 라이브러리들은 이미 기본 지원하고 있다.
settings.py에서 처리기를 사용하도록 설정한다. django-admin을 이용하여 프로젝트를 생성하면 TEMPLATE_CONTEXT_PROCESSORS 값이 없으니, 기본값인 auth, debug, i18n, media, request를 함께 적어야 한다.
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.request',
'context_processors.hijax', # context_processors.py의 위치에 따라 적절하게 모듈 경로를 지정
)
마지막으로, base_xhr.html을 템플릿 경로에 만든다. 여기서는 내용이 들어가는 블럭 이름이 content인 것으로 가정했다.'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.request',
'context_processors.hijax', # context_processors.py의 위치에 따라 적절하게 모듈 경로를 지정
)
{% block content %}{% endblock %}
이러한 기법을 이용하면 XHR이 작동하지 않는 브라우저에서도 간단히 폴백 페이지를 제공하여 접근성을 높일 수 있다. (Hijax라고 불리는 방법을 사용할 때 편리하다.)






