我希望几乎我的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似乎没有给我这个?
答案 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
之前。