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
相关产品推荐
相关产品推荐

