我试图围绕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”。
答案 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
方法来执行常见操作,包括渲染。