上传后获取保存文件(模型)的真实名称 - Django

Get the real name of saved file (Model) after upload - Django

我正在尝试获取 Django 中上传文件的真实名称。事实证明,如果模型中已经存在文件名,Django 将创建另一个名称。

例如,如果 'abc.xls' 在模型数据库中并且我尝试再次上传 'abc.xls',Django 将创建一个名为 'abc_123456.xls' 的文件。这不是问题!

我的问题是:如何在我的 view.py 中获取此名称 ('abc_123456.xls')?

def index(request):
    if 'GET' == request.method:
        form = DocumentForm()
        return render(request, 'auditoria_app/index.html', {'form': form})
    else:
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            
            # I'd like to get the correct file name here!

            mediaFolder = settings.MEDIA_ROOT

            fileName = f"{mediaFolder}/SAE/{form.cleaned_data['file'].get_alternative_name}" # .xlsm (Excel file)
            splitFileName = fileName.split('.')
            zipFileName = f"{splitFileName[0]}.zip" # .zip

我的模特:

from django.db import models
from django.core.validators import FileExtensionValidator

class Document(models.Model):
    file = models.FileField(upload_to='SAE/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.file)

您可以从具有 name 属性的文件中检索它。 Bu 它为您提供了包含 MEDIA_ROOT 的文件名。您可以从该属性中提取 MEDIA_ROOT。您也可以在 form.save(commit=False) 时检索对象 试试这个:

def index(request):
    if 'GET' == request.method:
        form = DocumentForm()
        return render(request, 'auditoria_app/index.html', {'form': form})
    else:
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            document = form.save(commit=False)
            document.save()

            # you can get file_name like this
            file_name = document.file.name.split('/')[-1]