2012-03-04 129 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 

但是,这是相当多的意见是如何工作的开箱即用;为什么你认为你需要从一个额外的自定义视图类继承?