Django文件上传后如何获取模型中保存的实际文件名
解决方案
你需要接收form.save()返回的已保存的Document模型实例,Django的文件重命名逻辑是在模型保存阶段执行的,所以最终存储的文件名只能从保存后的模型实例的file字段中获取。
修正后的视图代码
import os from django.conf import settings def index(request): if request.method == 'GET': form = DocumentForm() return render(request, 'auditoria_app/index.html', {'form': form}) else: form = DocumentForm(request.POST, request.FILES) if form.is_valid(): # 接收save方法返回的Document实例 doc = form.save() # 以下为不同维度的文件名获取方式,按需选用 # 1. 获取文件在服务器的绝对完整路径,比如 /data/media/SAE/abc_123456.xls full_file_path = doc.file.path # 2. 获取相对MEDIA_ROOT的存储路径,比如 SAE/abc_123456.xls relative_file_path = doc.file.name # 3. 仅获取自动生成后的最终文件名,比如 abc_123456.xls actual_file_name = os.path.basename(doc.file.name) # 你的后续逻辑可以直接用上面的变量 split_file_name = os.path.splitext(full_file_path) zip_file_name = f"{split_file_name[0]}.zip"
原代码错误原因
form.cleaned_data['file']是用户上传时的原始内存文件对象,此时还没有执行Django的重命名、路径生成逻辑,所以无法拿到最终存储的文件名。
内容的提问来源于stack exchange,提问作者Felipe Dourado
相关产品推荐
相关产品推荐

