You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }}转换成对应的属性访问逻辑,和视图里的规则是一致的。

额外注意事项

  1. 必须调用super().get_context_data(**kwargs):你原来的代码直接返回自定义的context,会丢失ListView默认提供的object_list(模型查询集数据),模板里循环展示列表内容时会出问题。
  2. 确认this_object_id的来源:要确保这个变量已正确定义,比如从URL路径参数中获取(self.kwargs.get('object_id')),不然会报变量未定义的错误。
  3. 关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:39:20