【问题标题】:Subclassing Django class based views?子类化基于 Django 类的视图?
【发布时间】:2012-03-22 07:34:05
【问题描述】:

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

【问题讨论】:

    标签: django django-class-based-views


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这是一种可能的方法:您的父类将在上下文中返回一个名为 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 方法来执行常见操作,包括渲染。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 2014-02-21
        • 2011-11-15
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多