Django에서 항상 설정을 사용하는 대신 템플릿을 렌더링 할 때 로더 목록을 제공하는 낮은 수준의 방법이 있습니까?Django - 요청별로 사용자 정의 템플릿 로더를 사용 하시겠습니까?
몇 가지보기 만 사용자 정의 템플릿 로더 인스턴스를 사용하고 싶습니다. (이유가 있습니다).
Django에서 항상 설정을 사용하는 대신 템플릿을 렌더링 할 때 로더 목록을 제공하는 낮은 수준의 방법이 있습니까?Django - 요청별로 사용자 정의 템플릿 로더를 사용 하시겠습니까?
몇 가지보기 만 사용자 정의 템플릿 로더 인스턴스를 사용하고 싶습니다. (이유가 있습니다).
독자가 직접 코드를 작성해야 할 것 같습니다. 당신은, 말하자면, the source의 관련 부분은 render_to_response
을 사용하는 경우의가로드 템플릿에 대한 일반 코드 경로를 살펴 보자 : 결국 다른 기능과 통과 django.template.loader.render_to_string
에 통화의
return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
최대 find_template
로 전화를 끊습니다.
처음으로 find_template
이 호출되면 settings.TEMPLATE_LOADERS
을 기반으로 전역 template_source_loaders
캐시를 초기화합니다. 그래서 당신이 전달할 수있는 추가적인 논증이없는 것 같아요.
보기의 지속 기간 동안 일부 로더를 에 추가하는 것이 하나의 가능성 일 수 있습니다. 그게 다른 문제를 일으킬 지 모르겠습니다. 그것은 더럽다고 느낀다. 그러나 그것이 일하면, 그것은 꽤 쉬울 것이다. (단지 그것을하는 뷰 데코레이터를 만드십시오.)
render_to_string
의 작업을 복제해야합니다. (정말로 확실하다면 per-view 템플릿 로더를 사용하고 싶습니다.이 로더는 전제로 받아 들여지고 있지만, 실제로는 필요하지 않습니다.) 거기에 많은 코드가 없으므로 사용하고자하는 특정 로더와 단일 템플릿 이름을 미리 알고 있다면 실제로는 꽤 쉽습니다. (이 안된하지만 것이다 아마 꽤 많은 일.)
def render_to_response_with_loader(loader, name,
dictionary=None, context_instance=None, mimetype=None, dirs=None):
# from find_template
t, display_name = loader(name, dirs)
# from get_template
if not hasattr(t, 'render'):
# template needs to be compiled
t = django.template.loader.get_template_from_string(t, origin, template_name)
# from render_to_string
if not context_instance:
rendered = t.render(Context(dictionary))
else:
# Add the dictionary to the context stack, ensuring it gets removed again
# to keep the context_instance in the same state it started in.
context_instance.update(dictionary)
try:
rendered = t.render(context_instance)
finally:
context_instance.pop()
# from render_to_response
return HttpResponse(rendered, mimetype=mimetype)
여러 가능한 로더 또는 가능한 파일 이름의 목록을 지원하려면
, 그냥 django.template.loader에서 관련 코드를 복사합니다.Dougal이 제안한대로 template_source_loaders를 수정하여이 작업을 끝내게되었습니다. 그가 말했듯이, 나는 이것이 안전하다는 것을 확신하지 못한다. (그것은 경쟁 조건을 만들 수 있는가?), 그러나 그것은 현재 나의 특별한 경우에 적용된다. Dougal이 제안한 다른 방법보다이 방법을 사용하는 이점은 {% extend %} 및 {% include %}에서도 수정 된 로더를 사용한다는 것입니다. 다음은 맞춤형 로더가있는 내 render_to_string입니다.
def render_to_string_with_loader(*args, **kwargs):
""" Call render_to_string using ReportTemplateLoader to find templates. """
import django.template.loader as loader
old_loaders = settings.TEMPLATE_LOADERS
settings.TEMPLATE_LOADERS = ('main.loaders.ReportTemplateLoader',)
loader.template_source_loaders = None # force refresh from settings
try:
out = render_to_string(*args, **kwargs)
finally:
# use finally make sure template errors can't mess up later requests
settings.TEMPLATE_LOADERS = old_loaders
loader.template_source_loaders = None
달콤한, 감사합니다 Dougal. – orokusaki