子类化基于Django类的视图?

时间:2012-03-04 15:50:14

标签: django django-class-based-views

我试图围绕Django从1.3开始的新的基于类的观点转变。

我做了一些阅读:

但是,我没有看到一个例子,或者怎么做的一件事是,几个视图可以继承一个共同的'父'类,重用那里的数据? (原谅我对常用命名法的抨击)

我想要做的一个例子:

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”。

2 个答案:

答案 0 :(得分:3)

首先,不要覆盖视图的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

但这几乎就是视图开箱即用的方式;为什么你认为你需要从另一个自定义视图类继承子类?

答案 1 :(得分: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方法来执行常见操作,包括渲染。