Django子类视图重写get_context_data()方法无效求助
嘿,我一眼就揪出问题所在啦!你在Feed子类里重写的get_context_data()方法根本没被执行,所以模板里的{{test}}才会显示为空,具体原因和解决办法如下:
核心问题:基础View类不触发get_context_data()
你的父类ProductList继承的是Django最基础的View类,而get_context_data()是Django通用视图(比如TemplateView、ListView这类继承了TemplateResponseMixin的视图)特有的方法——只有这些通用视图才会在请求流程里自动调用get_context_data()来生成模板上下文。
但你的ProductList是自己手写get()方法,直接构造data然后用render()返回响应,完全没有触发get_context_data()的逻辑,所以你在子类Feed里重写这个方法,根本没机会被执行,test变量自然到不了模板里。
两种解决方案
方案一:改用通用视图重构父类(推荐)
把父类改成继承TemplateView(它自带get_context_data()的调用机制),然后把原来get()方法里构造上下文的逻辑移到get_context_data()中:
from django.views.generic.base import TemplateView from django.contrib.auth.mixins import LoginRequiredMixin class ProductList(LoginRequiredMixin, TemplateView): template_name = 'product/product_scroll.html' def get_context_data(self, **kwargs): # 调用父类的方法获取基础上下文 context = super().get_context_data(**kwargs) # 把原来get()方法里构造data的逻辑放到这里,比如: # context['products'] = Product.objects.all() # ...其他你需要的上下文数据 return context class Feed(ProductList): template_name = "product/feed.html" def get_context_data(self, **kwargs): # 先获取父类生成的上下文 context = super().get_context_data(**kwargs) # 添加自定义的test变量 context['test'] = 'sometestinfo' return context
这样Django的通用视图框架会自动调用get_context_data(),你的test变量就能正常传递到模板里了。
方案二:不改父类继承,重写get()方法
如果不想修改父类的继承关系,那就在Feed子类里重写get()方法,直接在上下文里添加test变量:
首先建议把父类ProductList里构造上下文的逻辑抽成单独的方法(方便复用):
class ProductList(LoginRequiredMixin, View): template_name = 'product/product_scroll.html' def get_context(self, request): # 原来get()方法里构造data的逻辑全部移到这里 data = { # ...你的原有上下文数据 } return data def get(self, request, *args, **kwargs): data = self.get_context(request) return render(request, self.template_name, data)
然后子类Feed就可以调用这个方法来扩展上下文:
class Feed(ProductList): template_name = "product/feed.html" def get(self, request, *args, **kwargs): # 获取父类的基础上下文 context = self.get_context(request) # 添加自定义变量 context['test'] = 'sometestinfo' return render(request, self.template_name, context)
这样修改后,模板里的{{test}}就能正常渲染出sometestinfo啦!
内容的提问来源于stack exchange,提问作者Fernando Jesus Garcia Hipola

