2017-09-12 6 views
0

Ich versuche es so zu machen, dass wenn jemand versucht, eine Datei, die bereits hochgeladen wurde, mit einem Modell-Formular hochzuladen, verhindert das Formular die Einreichung. Hier ist der relevante Code:Einen Datei-Upload vollständig verhindern, wenn die Datei bereits in Django existiert

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}) 

Sagen wir, jemand eine Datei hochgeladen genannt document_1.xlsx . Die Art, wie dieser Code jetzt ist, wenn jemand versucht, eine andere Datei namens document_1.xlsx hochzuladen, lädt sie hoch und fügt vor dem Punkt ein seltsames Suffix hinzu. Ich will das nicht. Ich möchte, dass das Formular niemandem erlaubt, eine Datei, die bereits existiert, zu übertragen, ohne den Code zu brechen. Anscheinend fügt das Hinzufügen von 'unique = True' zum Dateifeld im Modell nicht zu. Ich habe so viele Fragen gesehen, die fragen, wie man eine Datei umbenennt, wenn sie bereits existiert, aber das möchte ich nicht. Ich möchte es vollständig stoppen, wenn dieser Dateiname bereits existiert. Vielen Dank.

EDIT: Ich glaube nicht, dass dies ein Duplikat einer anderen Frage ist. Diese Frage fragt, wie eine Datei mit demselben Namen überschrieben wird. In dieser Frage wird gefragt, wie verhindert werden kann, dass eine Datei mit demselben Namen hochgeladen wird.

+0

Mögliches Duplikat [Wie Django, um zu verhindern Ändern von Dateinamen, wenn eine Datei mit diesem Namen existiert bereits? ] (https://stackoverflow.com/questions/9214904/how-to-prevent-django-from-changing-file-name-when-a-file-with-that-name-ready) –

+0

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

Antwort

1

Sie müssen die Standardbereinigungsmethode für Ihr Formular überschreiben, um die Logik der Überprüfung hinzuzufügen, ob die Datei vor dem Speichern vorhanden ist.

Versuchen Sie, die unten in Ihre FileForm Klasse:

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

In welches Modul soll es gehen? Wollen Sie damit sagen, dass es in forms.py innerhalb der FileForm-Klasse gehen sollte? Sollte es vor oder nach der Klasse Meta gehen? –

+0

Ja, in Ihrer forms.py, nach der Meta-Klasse. – Hisagr

+0

Anscheinend das Hinzufügen, das gab mir diesen Fehler, wenn ich versuche, eine Datei hochzuladen: Kann 'InMemoryUploadedFile' -Objekt nicht implizit in str konvertieren –

0

Sie diese auf die saubere Methode Ihrer Form erreichen kann. Überprüfen Sie einfach, ob es ein Formular mit diesem Namen gibt. Wenn es einen gibt, einen Validierungsfehler auslösen. So etwas wie: (. Ich bin nicht 100%, dass dies funktionieren würde, aber die Lösung ist unten auf diesen Linien)

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') 
Verwandte Themen