Django类视图返回上下文问题:函数视图正常类视图失效求助
在Django类视图中添加自定义上下文的解决方案
这个问题我之前也碰到过,其实核心原因是:你使用的CreateView默认只会把表单对象(form)和一些通用变量传入模板上下文,而你需要的AccessRecord查询集并没有被自动包含进去。咱们只需要重写类视图的get_context_data方法,就能在保留原有上下文的基础上,添加自定义的数据了。
完整的类视图代码示例
from django.views.generic.edit import CreateView from .models import AccessRecord from .forms import RegisterUserForm class IndexView(CreateView): form_class = RegisterUserForm template_name = "index.html" def get_context_data(self, **kwargs): # 先调用父类方法获取默认的上下文(包含表单等数据) context = super().get_context_data(**kwargs) # 添加你需要的AccessRecord查询集到上下文 context['access_records'] = AccessRecord.objects.order_by('date') # 如果之后需要添加更多自定义数据,直接往context字典里加就行 # 比如 context['another_data'] = SomeModel.objects.all() return context
原理说明
get_context_data是Django通用类视图中负责构建模板上下文的核心方法。重写它时:
- 首先调用
super().get_context_data(**kwargs)获取父类生成的默认上下文,这样不会丢失CreateView原本提供的表单数据; - 然后向返回的
context字典中添加你需要的自定义数据,这里就是按日期排序的AccessRecord查询集; - 最后返回更新后的上下文,模板就能像之前函数视图一样,通过
{{ access_records }}来遍历展示数据了。
这样修改后,你的模板既可以正常使用注册表单,又能正确显示AccessRecord的记录啦!
内容的提问来源于stack exchange,提问作者timi95
相关产品推荐
相关产品推荐

