Django ListView上下文存在object_list与massage_list两份相同QuerySet问题咨询
问题解答
这是Django ListView的正常内置行为,不属于代码编写错误,和你路由里配置的name='massage_list'也没有关联,路由的name属性仅用于URL反向解析,不会影响上下文变量生成。
具体产生原因
Django的ListView继承了MultipleObjectMixin类,该类在向模板注入上下文时,会默认添加两份指向同一个查询集的变量:
- 通用命名的
object_list:是所有ListView统一提供的通用上下文变量,方便开发者编写通用模板时复用逻辑 - 基于模型名自动生成的业务变量:生成规则为
模型类名小写 + _list后缀,你使用的模型是Massage,因此自动生成的上下文变量就是massage_list,值和object_list完全一致,目的是让模板中的变量命名更贴合业务场景,提升可读性。
可选优化方案
如果你不想让上下文出现重复变量,也可以主动指定上下文变量名,只需在视图类中添加context_object_name属性即可:
class MassageListView(ListView): # 新增该行指定上下文变量名 context_object_name = "massage_list" # 其余原有代码保持不变 def get_queryset(self): return Massage.objects.filter(time_of_receipt__year=now().year, time_of_receipt__month=now().month) def get_context_data(self, *, object_list=None, **kwargs): context = super(MassageListView, self).get_context_data(**kwargs) month_salary = 0 for i in context['object_list']: month_salary += i.price context['month_salary'] = month_salary context['form'] = MassageForm() print(context) return context
指定该属性后,上下文只会保留你自定义的massage_list变量,不会再生成默认的object_list,可减少上下文冗余。
内容的提问来源于stack exchange,提问作者gornichnyx
相关产品推荐
相关产品推荐

