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

Django admin自定义CSV上传报错object has no attribute 'model'求助

错误排查与修复方案

核心错误原因

你在CsvUploader类的__init__初始化方法中,接收了传入的模型类参数,但没有将其赋值给实例的model属性,后续代码调用self.model时自然会抛出属性不存在的异常。

其他附带问题

  • 参数命名不匹配:你调用CsvUploader时传入的第二个参数是self.model(实际的Django模型类,不是模型名字符串),但__init__的第二个参数命名为model_name,存在语义混淆。
  • 代码缩进错误:CsvUploader实例化的代码放在了CSV文件后缀判断的逻辑块之外,即使上传的不是CSV文件也会执行实例化逻辑,会触发额外报错。
  • 缺少成功响应:CSV处理完成后没有给用户返回成功提示和跳转,会触发Django响应缺失异常。

修复代码

1. 修改CsvUploader.py的初始化方法

class CsvUploader:
    # 调整参数名,新增self.model赋值
    def __init__(self, csv_file, model, app_name):
        self.model = model # 核心修复:将传入的模型类赋值给实例属性
        self.reader = list(csv.DictReader(csv_file, delimiter=','))
        self.keys = [k for k in self.reader[0]]
        self.model_fields = [f.name for f in  self.model._meta.get_fields()]
        self.valid = self._validate_csv()
        self.csv_pos = 0
    # 其余代码保持不变即可

2. 修正Admin代码中upload_csv方法的缩进和响应逻辑

def upload_csv(self, request):
    if request.method == "POST":
        form = CsvUploadForm(request.POST, request.FILES)
        if form.is_valid():
            if request.FILES['csv_file'].name.endswith('csv'):
                try:
                    decoded_file = request.FILES['csv_file'].read().decode('utf-8')
                except UnicodeDecodeError as e:
                    self.message_user(
                        request,
                        "There was an error decoding the file:{}".format(e),
                        level=messages.ERROR
                    )
                    return redirect("..")
                # 调整缩进:实例化逻辑放在CSV判断块内
                io_string = io.StringIO(decoded_file)
                uploader = CsvUploader(io_string, self.model, portal)
                result = uploader.create_records()
                # 新增成功提示和跳转
                self.message_user(request, result)
                return redirect("..")
            else:
                self.message_user(
                request,
                "Incorrect file type: {}".format(
                    request.FILES['csv_file'].name.split(".")[1]
                    ),
                level=messages.ERROR
                )
                return redirect("..")
        else:
            self.message_user(
                request,
                "There was an error in the form {}".format(form.errors),
                level=messages.ERROR
            )
            return redirect("..")

可选优化

你现在CsvUploader里硬导入了Link模型,但是因为你已经通过参数动态传入模型类了,这个导入是冗余的,可以直接删掉。

内容的提问来源于stack exchange,提问作者AWScloudguru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:45:02