Django ListView访问模型实例字段报错:object does not support indexing
解决「object does not support indexing」错误:正确访问Django模型对象字段
你遇到的问题其实很典型——Django的模型实例不是字典,不能用obj['foo']这种索引方式访问字段,得用点符号来调用属性!
修复后的完整代码
先给你调整好的views.py代码:
class MyView(generic.ListView): template_name = "my_item_list.html" model = MyModel def get_context_data(self, **kwargs): # 先调用super()获取ListView默认上下文,别丢了列表数据! context = super().get_context_data(**kwargs) # 假设this_object_id已正确获取(比如从URL参数里拿到) obj = MyModel.objects.get(pk=this_object_id) # 用点符号直接访问模型字段 var_a = obj.foo var_b = obj.bar result = var_a * var_b # 把计算结果添加到上下文 context['result'] = result return context
为什么原来的代码会报错?
Model.objects.get()返回的是模型实例对象,不是Python字典。你可以把它理解成一个自定义的类实例,访问它的数据库字段(也就是类属性)必须用.符号,比如obj.foo、obj.bar,而非字典的索引语法obj['foo']。
你提到把obj传到模板里能正常获取字段值,那是因为Django模板引擎在渲染时,会自动把{{ obj.foo }}转换成对应的属性访问逻辑,和视图里的规则是一致的。
额外注意事项
- 必须调用
super().get_context_data(**kwargs):你原来的代码直接返回自定义的context,会丢失ListView默认提供的object_list(模型查询集数据),模板里循环展示列表内容时会出问题。 - 确认
this_object_id的来源:要确保这个变量已正确定义,比如从URL路径参数中获取(self.kwargs.get('object_id')),不然会报变量未定义的错误。 - 关于
model_to_dict():虽然你觉得这种方式繁琐,但如果确实需要把模型实例转成字典,也可以这么用,但完全没必要——点符号访问才是Django模型实例的标准用法:from django.forms.models import model_to_dict obj_dict = model_to_dict(obj) var_a = obj_dict['foo']
内容的提问来源于stack exchange,提问作者Bill Armstrong
相关产品推荐
相关产品推荐

