2012-06-14 3 views

답변

3

독자가 직접 코드를 작성해야 할 것 같습니다. 당신은, 말하자면, 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에서 관련 코드를 복사합니다.

+0

달콤한, 감사합니다 Dougal. – orokusaki

1

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 
관련 문제