【问题标题】:Preventing a file upload completely if file already exists in Django如果文件已在 Django 中存在,则完全阻止文件上传
【发布时间】:2017-09-12 20:27:25
【问题描述】:

我正在尝试这样做,以便当有人尝试使用模型表单上传之前已经上传的文件时,该表单将阻止它提交。以下是相关代码:

models.py

class File(models.Model):
    file = models.FileField(upload_to='documents/')

forms.py

class FileForm(forms.ModelForm):
    file = forms.FileField()

    class Meta:
        model = File
        fields = ('file',)

views.py

def file_upload(request):
    if request.method == 'POST':
        form = FileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('list_files')
        else:
            logger.error(form.errors)
    else:
        form = FileForm()

    return render(request, 'files/file_upload.html', {'form': form})

假设有人上传了一个名为 document_1.xlsx 的文件。这段代码现在的方式是,如果有人尝试上传另一个名为 document_1.xlsx 的文件,它将上传并在点之前添加一些奇怪的后缀。我不想要那个。我希望表单不允许任何人在不破坏代码的情况下上传已经存在的文件。显然向模型中的文件字段添加 'unique=True' 是行不通的。我已经看到很多问题询问如何重命名文件,如果它已经存在,但我不希望这样。如果该文件名已经存在,我想完全停止它。谢谢。

编辑:我不相信这是另一个问题的重复。该问题询问如何覆盖具有相同名称的文件。这个问题是问如何防止同名文件上传。

【问题讨论】:

标签: python django file-upload


【解决方案1】:

您需要覆盖表单的默认清理方法,以添加在保存之前检查文件是否存在的逻辑。

在您的 FileForm 类中尝试以下操作:

import os
from django.core.exceptions import ValidationError

def clean(self):
    file_path = "your folder/" + self.cleaned_data.get('file')
    if os.path.isfile(file_path):
        raise ValidationError('File already exists') 
    return self.cleaned_data

【讨论】:

  • 它应该进入哪个模块?您是说它应该放在 FileForm 类中的 forms.py 中吗?它应该放在 Meta 类之前还是之后?
  • 是的,在你的 forms.py 中,在 Meta 类之后。
  • 当我尝试上传文件时,显然添加了这个错误:无法将'InMemoryUploadedFile'对象隐式转换为str
  • 你只需要 str(self.cleaned_data.get('file')) 就可以了 :)
【解决方案2】:

您可以在表单的 clean 方法上完成此操作。只需检查它是否有具有该名称的表单。如果有,则引发验证错误。类似的东西:(我不是 100% 认为这会起作用。但解决方案是这样的)

def clean_file(self):
    file = self.cleaned_data['file']
    if FileModel.objects.filter(file__name=file.name).exist():
        raise ValidationError('There is already a file with that name on our system')

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 2017-02-20
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多