如何在Django Admin无需绑定模型上传文件并解决InMemoryUploadedFile问题
Django Admin 上传CSV写入对应模型的轻量实现方案
如果你需要在Django Admin后台上传CSV文件,将文件内容写入对应模型,无需扩展change_form.html、也不用重写response_change方法(我最初尝试过该方案,流程比较繁琐),可以直接通过自定义ModelForm的方式实现,代码如下:
from django.core.files.storage import default_storage from django.core.files.base import ContentFile from django.conf import settings from django import forms from .models import Store class StoreAdminForm(forms.ModelForm): # 添加额外的文件上传字段 upfile = forms.FileField() class Meta: model = Store fields = "__all__" def clean(self): cleaned_data = super(StoreAdminForm, self).clean() if "upfile" in self.changed_data: # 此处可补充文件类型、大小等校验逻辑 # 处理InMemoryUploadedFile类型的上传文件 path = settings.MEDIA_ROOT.joinpath("___tmp___") tmp_file = default_storage.save(path, ContentFile(cleaned_data["upfile"].read())) # 读取临时文件内容 with open(tmp_file, encoding = "utf8") as f: data = f.readlines() # 后续可自行补充解析CSV内容、写入对应模型的逻辑 # ...
该方案核心解决了上传文件为InMemoryUploadedFile类型时无法直接按本地路径读取的问题,我之前在这个点上耗费了不少时间,整理出来供大家参考。
内容的提问来源于stack exchange,提问作者xtlc
相关产品推荐
相关产品推荐

