2012-03-04 126 views
1

我試圖繞過Django從1.3開始的基於類的新視圖。子類化基於Django類的視圖?

我已經做了一些閱讀:

但有一件事我還沒有看到的例子,或者如何做的是,可以幾個視圖子類化一個常見的「父」類,重用這裏的數據? (請原諒我的共同命名的顛簸)

的什麼,我試圖做一個例子:

class MyParentClass(TemplateView): 
    def get(self, request, *args, **kwargs): 
    session_data = request.session 
    other_variables = foovars 
    return self.render_to_response(context) 

class MyChildClassOne(TemplateView): 
    template_name = "template_one.htm" 

    def get(self,request, *args, **kwargs): 
     resultant_data = foodata 
     return {'data' : resultant_data } 


class MyChildClassTwo(TemplateView): 
    template_name = "template_two.htm" 

    def get(self,request, *args, **kwargs): 
     other_data = foootherdata 
     return {'data' : other_data } 

這樣兩個子類之間唯一的區別是他們使用的模板和「數據」他們回來了。兩個視圖都會返回父類的session_data和other_variables,因此不會在每個子類中重複「return session_data,other_variables」。

回答

1

以下是一種可能的方法:您的父類將在由子類設置的上下文中返回一個名爲data的變量。

例子:

class MyParentClass(TemplateView): 
    def get(self, request, *args, **kwargs): 
     session_data = request.session 
     other_variables = foovars 
     context['data'] = data 
     return self.render_to_response(context) 

class MyChildClassOne(MyParentClass): 
    template_name = "template_one.htm" 

    def get(self,request, *args, **kwargs): 
     data = foodata 
     return super(MyChildClassOne, self).get(request, args, kwargs) 


class MyChildClassTwo(MyParentClass): 
    template_name = "template_two.htm" 

    def get(self,request, *args, **kwargs): 
     data = foootherdata 
     return super(MyChildClassTwo, self).get(request, args, kwargs) 

兩個孩子從類繼承MyParentClass,其get方法自動設置一個名爲data到上下文變量。數據值由子類提供。一旦完成,他們會調用父母的get方法來執行常見操作,包括渲染。

2

首先,請勿覆蓋您的視圖的方法get。由於幾個原因我不會進入這裏,這很危險。

Anmyway,你需要的是get_context_data方法,它返回被傳遞給模板的上下文字典。

所以,無論你的孩子的意見應該是這個樣子:

class ChildView(ParentView): 
    template_name = "foo" 
    def get_context_data(self, **kwargs): 
     context = super(ChildView, self).get_context_data(**kwargs) 
     context.update({ 
      'foodata': 'bardata', 
     }) 
     return context 

但是,這是相當多的意見是如何工作的開箱即用;爲什麼你認爲你需要從一個額外的自定義視圖類繼承?