2010-05-15 61 views
1

我試圖構建一個Django TemplateLoader,但是我不能讓它'看''當前的上下文或請求,所以我不能用它做很多事情。如何獲取Django TemplateLoader查看當前上下文或請求?

有誰知道我該如何使Django TemplateLoader做到這一點?

非常感謝

+2

需要更多信息。爲什麼它需要訪問請求或上下文?你想達到什麼目的? – 2010-05-15 20:44:20

+0

我試圖實現一個TemplateLoader,它可以動態地決定從移動文件夾或任何地方加載模板。 我知道有一些方法可以通過使用render_to_response選項等工具來完成此工作,但我不想這樣做,因爲我希望能夠在標準頁面上包含移動版本的模板。 希望它是有道理的:) – 2010-05-16 12:37:27

回答

1

的地方,使有關模板的決定是在您的視圖。在那裏,您可以訪問請求,並且可以根據您喜歡的任何條件動態構建模板名稱。例如,

def my_view(request, ...): 
    ... 
    template_name = 'template.html' 
    if is_mobile(request): template_name = 'mobile_' + template_name 
    template = get_template(template_name) 
    context = RequestContext(request, {...}) 
    return HttpResponse(template.render(context)) 

你在哪裏提供is_mobile()。更好的辦法是提供一個接受請求和模板名稱的方法,並返回一個經過適當修改的方法(以便您可以對該邏輯進行一次編碼,而不是散佈在多個視圖中)。

您可能還會從select_template()獲得一些槓桿,它將獲取候選模板名稱列表,併爲其找到的第一個模板返回一個模板。

+0

是的,我有一些類似的東西目前作爲替代render_to_response(稱爲模板)的地方,但我如何將它應用於像 django.contrib.auth.views.login,因爲他們使用正確的render_to_response – 2010-05-17 17:15:49

+0

您不需要直接從urlpattern調用django.contrib.auth.views.login。您可以將其包裝爲使用請求的其他視圖來確定要傳遞它的template_name。 – 2010-05-17 17:56:22

+0

噢好吧。那麼我會考慮這樣做。非常感謝 :) – 2010-05-17 19:49:32