Django:正确使用基于类的View继承?

时间:2015-09-08 19:42:58

标签: python django django-class-based-views

我希望几乎我的Django项目中的每个View都可以计算,例如time_on_mars。需要将此变量放入每个模板上下文中,因此每个模板都可以绘制time_on_mars。我也希望每个View能够使用该变量,如果它愿意,也许可以计算is_it_nighttime_on_mars或其他什么。我想使用继承或其他一些机制来做这件事,所以当我提供比火星时间更多的东西时,我不会重复自己。

这是否适合使用基于类的视图?我想我会创建一个基类视图,并在其get和post方法中,计算火星上的当前时间,然后调用子类方法'doGet'或'doPost',拦截结果,将火星时间放入结果中,并继续。似乎乏味。

装饰?有没有办法将time_on_mars放入视图的闭包上下文中?

pythonic(djangonic?)的方法是什么?

编辑:我喜欢上下文处理器的想法,但我改变了主意 - 而不是每个视图,我希望大多数视图来实现这一点。特别是如果计算火星上的时间是昂贵的......

编辑2:问题描述不充分!澄清:

我有很多观点可以做到这一点:

def some_view(request):
   w,x,y,z = provision_wxyz()
   ... some biz logic, maybe compute a,b,c using w,x,y,z ...
   return render(request, 'some_template.html', { 'a':a, 'b':b, 'c':c, 'w':w, 'x':x, 'y':y, 'z':z })

...我想抽象出第一步(w,x,y,z =),以及将w,x,y,z添加到模板上下文中。上下文处理器不起作用,因为在some_view业务逻辑中,我想要访问w,x,y,z。我不喜欢在TemplateView上做CLA的混音策略,因为它再次让我无法访问some_view中的w,x,y和z(或者some_view的等价物),我想,好吧,在某处做一堆业务逻辑,而TemplateView似乎没有给我这个?

1 个答案:

答案 0 :(得分:1)

你绝对可以使用CBV。对于利用蟒蛇多重继承的Mixins来说,这是一个很好的用途。这是我刚刚写完的一个快速而又肮脏的例子。

class MarsMixin(object):
    time_on_mars = 5

    def get_time_on_mars(self):
        """
        Does what it takes to return a time on mars be it calculation
        or returning a property set on the object. Should return a property
        from the object if it is a constant. Should calcualte in the method
        if it is going to be dynanic
        """
        return self.time_on_mars

    def get_context_data(self, **kwargs):
        context = super(MarsMixin, self).get_context_data(**kwargs)
        context['time_on_mars'] = self.get_time_on_mars()
        return context


class HomeView(MarsMixin, TemplateView):
    template_name = 'home/index.html'

最大的笔记是mixin继承自object。另一个是你继承了HomeView中的mixin,它列在TemplateView之前。