2017-09-12 62 views
0

我試圖讓有人試圖上傳之前已經上傳過的模型文件,表單會阻止它提交。下面是相關代碼:如果文件已經存在於Django中,則完全阻止文件上傳

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'不起作用。我見過很多問題,如果它已經存在,如何重命名文件,但我不希望這樣。如果該文件名已經存在,我想完全停止它。謝謝。

編輯:我不相信這是另一個問題的重複。該問題詢問如何覆蓋具有相同名稱的文件。這個問題是要求如何防止上傳同名的文件。

+0

的[如何防止從Django的時候使用該名稱的文件已經存在更改文件名可能的複製? ](https://stackoverflow.com/questions/9214904/how-to-prevent-django-from-changing-file-name-when-a-file-with-that-name-already) –

+0

Docs:https:/ /docs.djangoproject.com/en/1.11/ref/forms/validation/#cleaning-a-specific-field-attribute – allcaps

回答

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 
+0

應該插入哪個模塊?你是否說它應該在FileForm類的forms.py中?它應該在Meta類之前還是之後? –

+0

是的,在你的forms.py中,類Meta後。 – Hisagr

+0

顯然,當我嘗試上傳文件時給了我這個錯誤:無法將'InMemoryUploadedFile'對象隱式轉換爲str –

0

您可以在形式的清潔方法做到這一點。只需檢查它是否存在具有該名稱的表單。如果有,提出驗證錯誤。喜歡的東西:(我不是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') 
相關問題