如何让BaseView的setup方法中定义的mydata自动传入模板?
解决方法
要让BaseView中定义的mydata自动添加到模板上下文,不用每个子类手动拼接,你可以在BaseView里新增一个获取基础上下文的方法,子类调用这个方法来合并自己的上下文内容。
步骤1:修改BaseView,添加上下文方法
在BaseView中新增get_context_data方法,把mydata加入上下文:
class BaseView(View): def setup(self, request, *args, **kwargs): super().setup(request, *args, **kwargs) self.mydata = table.objects.all() def get_context_data(self, **kwargs): # 初始化上下文,优先用传入的kwargs,没有则新建空字典 context = kwargs.get('context', {}) # 把mydata加入上下文 context['mydata'] = self.mydata return context
步骤2:修改子类的get方法,合并上下文
在子类的get方法中,调用父类的get_context_data来合并你的自定义上下文,这样mydata就会自动被加入到模板可用的变量里:
def get(self, request, pk=''): print('self.active_apps in plan') print(self.active_apps) # 先构建自己需要的上下文内容 user_info = request.session.get('user_info') context = {'user_info': user_info} if pk != '': item = get_object_or_404(self.model_class, pk=pk) form = self.form_class(instance=item) context['form'] = form context['pk'] = pk else: form = self.form_class() context['form'] = form # 调用父类方法,把mydata加入上下文 context = self.get_context_data(context=context) return render(request, self.template_name, context)
或者更简洁的写法,先获取父类的基础上下文,再往里面加自己的内容:
def get(self, request, pk=''): print('self.active_apps in plan') print(self.active_apps) # 先获取父类的基础上下文(已经包含mydata) context = self.get_context_data() # 添加自己的内容到上下文 user_info = request.session.get('user_info') context['user_info'] = user_info if pk != '': item = get_object_or_404(self.model_class, pk=pk) form = self.form_class(instance=item) context['form'] = form context['pk'] = pk else: form = self.form_class() context['form'] = form return render(request, self.template_name, context)
这样修改后,所有继承BaseView的子类,只要调用get_context_data方法,mydata就会自动出现在模板中,不用再手动添加。
内容的提问来源于stack exchange,提问作者NASRIN
相关产品推荐
相关产品推荐

