Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果Django中已存在文件,则阻止完全上载文件_Python_Django_File Upload - Fatal编程技术网

Python 如果Django中已存在文件,则阻止完全上载文件

Python 如果Django中已存在文件,则阻止完全上载文件,python,django,file-upload,Python,Django,File Upload,我正试图这样做,当有人试图上传一个文件,已经上传了一个模型表单之前,表单将阻止它提交。以下是相关代码: 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

我正试图这样做,当有人试图上传一个文件,已经上传了一个模型表单之前,表单将阻止它提交。以下是相关代码:

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”添加到模型中的文件字段不起作用。我已经看到很多问题,问如何重命名一个文件,如果它已经存在,但我不想这样。如果文件名已经存在,我想完全停止它。谢谢


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

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

在您的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

您可以在表单的clean方法上完成此操作。只要检查一下是否有一张有这个名字的表格。如果有,则引发验证错误。比如:(我不是100%认为这会起作用,但解决办法是这样的)


它应该进入哪个模块?您是说它应该放在FileForm类中的forms.py中吗?它应该在类Meta之前还是之后?是的,在你的forms.py中,在类Meta之后。显然,当我尝试上载文件时,添加这一点会导致此错误:无法将'InMemoryUploadedFile'对象隐式转换为str。你只需要str(self.cleaned_data.get('file'),它就会工作:)文档的可能重复:
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')