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