1

我正试图从 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”。

4

2 回答 2

4

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

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

于 2013-09-11T23:07:27.607 回答
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方法来执行常见的操作,包括渲染。

于 2012-03-04T16:16:58.313 回答