2016-11-10 2 views
1

Ich arbeite an einem Django/Python-Projekt. Dieses Projekt verwendet ein Modell, das ein FileField enthält. Dieses Modell wird von einem Webformular gespeist. Alles funktioniert gut: Django benennt die Datei automatisch um, wenn bereits eine Datei mit dem gleichen Namen existiert.So generieren Sie einen eindeutigen Dateinamen für django model.FileField

Ich habe ein zweites Modell, das auch ein FileField enthält. Diese Datei wird jedoch nicht über ein Webformular hochgeladen. Dieser Dateiinhalt wird von einem Python-Programm in der Datei generiert. Ich möchte beim Einfügen einen Dateinamen angeben. Und ich möchte Django/Python automatisch umbenennen, da es das Webformular nicht gibt. Wie soll ich tun?

Danke.

Antwort

1

Ich denke, mit UUID wird der Dateiname so lange machen. Dies kann auch Ihnen helfen: -

import os, random, string 
    length = 13 
    chars = string.ascii_letters + string.digits + '[email protected]#$%^&*()' 
    random.seed = (os.urandom(1024)) 
    a = ''.join(random.choice(chars) for i in range(length)) 

Hinweis: - Stellen Sie den Längenparameter nach Ihrem Wunsch.

filename = '%s%s' % (Yourfilename,str(a)) 

ändern models.py als:

fileName = CharField(max_length=10, blank=True,unique=True) 

ändern views.py als:

try: 
    filename = filename 
    storeFileName = models.objects.create(fileName=filename) 
except Exception,e: 
    import os, random, string 
    length = 13 
    chars = string.ascii_letters + string.digits + '[email protected]#$%^&*()' 
    random.seed = (os.urandom(1024)) 
    a = ''.join(random.choice(chars) for i in range(length)) 

    filename = '%s%s' % (Yourfilename,str(a)) 

    storeFileName = models.objects.create(fileName=filename) 

können Sie nicht unique=True für fileField setzen diese Fehler in Django könnte es funktionieren wird wie folgt:

Offenbar, was passiert ist das: Wenn die Datei bereits vorhanden ist, erhält die neue Datei den Namen < >., Wobei <> die Anzahl der Unterstriche ist, die erforderlich sind, um den Namen eindeutig zu machen. Wenn zum Beispiel eine Datei namens foo.png mehrfach hochgeladen wird, heißt die zweite Datei foo_.png, die dritte foo __. Png und so weiter. Dies sollte jedoch wahrscheinlich dokumentiert werden. Ich bin mir nicht sicher, ob diese Umbenennung im Admin-Code oder im Model-Code passiert.

So haben Sie vielleicht nur eine Option, um den Dateinamen separat abzuspeichern und vor dem Hochladen der Datei einzuchecken.

+0

Thanks getan wird, aber wenn Datei nicht existiert, möchte ich den ursprünglichen Namen behalten. Was soll ich tun, wenn 2 den Zugriff gleichzeitig mit dem gleichen Dateinamen verarbeitet ... Ist es möglich, den Test der vorhandenen Datei atomar zu machen? – Bob5421

+0

dann sollten Sie im Modell fileField als eindeutiges Feld hinzufügen. Und im Skript versuchen Sie, Datei zu speichern, wenn die Datenbank, wenn Sie doppelt erhalten haben, können Sie Ausnahme schreiben und Dateinamen ändern und dann speichern. –

+0

Überprüfen Sie meine letzte Bearbeitung @ Bob5421 –

2

Ich denke, der einfachste Weg, dies zu tun in dieser Antwort erklärt:

https://stackoverflow.com/a/10501355/3848720

Sie können entweder nur die Dateinamen nennen eine universell eindeutige Kennung (UUID), wie in der Antwort oben. Oder Sie könnten die UUID auf den vorhandenen Namen anhängen wie folgt:

import uuid 

filename = '%s%s' % (existing_filename, uuid.uuid4()) 
+0

Ich glaube nicht, dass es beim Hochladen so funktioniert, weil das Suffix nicht auf einen UUID schaut. In der Tat möchte ich wissen, ob diese automatische Umbenennung per FileField oder etwas anderes in django – Bob5421

Verwandte Themen