2012-12-04 37 views
3

我有一個模板,我希望能夠直接提供並在我的Django應用程序中嵌入任意其他模板。我試圖爲它創建一個視圖類,看起來像這樣:將Django視圖類渲染爲字符串或響應

class TemplateView(View): 
    def get(self, request): 
     context = self._create_context(request) 
     return render_to_response('template.html', context) 

    def get_string(self, request): 
     context = self._create_context(request) 
     return render_to_string('template.html', context) 

    def _create_context(self, request): 
     context = {} 
     # Complex context initialization logic... 
     return context 

我有線get我的Django的網址。不過,我一直無法弄清楚如何實例TemplateView,這樣我可以從其他視圖調用get_string

必須有一個更好的方式去這樣做。想法?

更新:我看到一些人在談論發出請求,並在內部使用response.content,這將節省我不必寫get_string方法。所以,也許一個更好的問題是:如何讓我從另一個視圖TemplateView的請求?

+0

你是如何將'get'連接到你的Django URL的? 'get'通常通過View的dispatch()方法調用。 –

+0

@DerekKwok我的意思是說我連接了'TemplateView.as_view',後者又調用GET請求'get'。 –

回答

3

我會按照Django的CBV模式:它通過dispatch返回什麼方法確定。默認情況下根據request.method。爲什麼不基於傳遞給dispatch()任何其他的說法?

所以子類調度,並給它一個方法來確定是否要返回get_string

def dispatch(self, request, *args, **kwargs): 
    if 'as_string' in kwargs: 
     return self.get_string(request)   
    return super(TemplateView, self).dispatch(request, *args, **kwargs) 

response = TemplateView.as_view()(request, as_string=True) 
+0

奇妙的想法,謝謝!這是否返回self.as_string(request)'''正確,但是?似乎它應該讀取'''返回self.get_string(request)'''。 – raratiru

+0

@rara_tiru確實。接得好。 –