在django中,当使用基于类的视图时,通常设置类级变量,例如 template_name
class MyView(View):
template_name = 'index.html'
def get(self, request):
...
Run Code Online (Sandbox Code Playgroud)
我想知道是否在运行时修改这些变量
class MyView(View):
template_name = 'index.html'
def get(self, request):
if some_contrived_nonce_function(): # JUST SO IT ONLY RUNS ONCE
self.template_name = 'something.html'
...
Run Code Online (Sandbox Code Playgroud)
将仅针对该请求(MyView每个请求创建一个新实例),或者它将持续所有后续请求(使用相同的实例MyView)
每个请求都会创建该类的新实例,处理请求并销毁它.基于类的视图的原因不是维护实例,而是允许继承和mixin组合.这使得创建跨多个视图的可重用功能变得非常容易.
您可以在类的生命周期中的任何位置更改变量.这些变量变得重要的唯一一点是处理请求时,特别是在dispatch()方法期间,其他HTTP操作方法喜欢get()和post()包装.
我强烈建议您为Classy Class-based Views网站添加书签,因为它提供了一个非常全面的概述,介绍了基于类的视图的组成方式以及它们如何继承.在基于类的视图中更改模板名称的最合适方法是覆盖a上的get_template_names()方法TemplateView.
class MyView(TemplateView):
def get_template_names(self):
if some_contrived_nonce_function():
return 'something.html'
else:
return super(MyView, self).get_template_names()
Run Code Online (Sandbox Code Playgroud)
以上假设您的视图要么继承,TemplateView要么实现TemplateResponseMixin.
将其修改为:
self.template_name = 'something.html'
Run Code Online (Sandbox Code Playgroud)
肯定只会持续该请求。
将其修改为:
type(self).template_name = 'something.html'
Run Code Online (Sandbox Code Playgroud)
将导致新实例继承您的更改。