In django ändern Sie den Dateinamen einer hochgeladenen Datei

Ist es möglich, den Dateinamen einer hochgeladenen Datei in django zu ändern? Ich suchte, konnte aber keine Antwort finden.

Meine Anforderung ist, wann immer eine Datei hochgeladen wird, sollte der Dateiname im folgenden Format geändert werden.

format = userid + transaction_uuid + file_extension 

Vielen Dank…

3 Solutions collect form web for “In django ändern Sie den Dateinamen einer hochgeladenen Datei”

Wie lädst du die Datei hoch? Ich nehme mit dem FileField .

Die Dokumentation für FileField.upload_to sagt, dass das Feld upload_to ,

Kann auch ein abrufbarer, wie eine Funktion, die aufgerufen werden, um den Upload-Pfad, einschließlich der Dateiname zu erhalten. Dieser Aufruf muss in der Lage sein, zwei Argumente zu akzeptieren und einen Unix-Style-Pfad (mit Schrägstrichen) zurückzugeben, um an das Speichersystem weitergegeben zu werden. Die beiden Argumente, die verabschiedet werden, sind:

" Instanz ": Eine Instanz des Modells, in dem das FileField definiert ist. Genauer gesagt, dies ist die besondere Instanz, wo die aktuelle Datei angehängt wird.

" Dateiname ": Der Dateiname, der ursprünglich der Datei zugewiesen wurde. Dies kann bei der Bestimmung des endgültigen Zielpfades berücksichtigt werden oder auch nicht.

So sieht es so aus, als müsst du nur eine Funktion machen, um deine Namenshandhabung zu machen und den Pfad zurückzugeben.

 def update_filename(instance, filename): path = "upload/path/" format = instance.userid + instance.transaction_uuid + instance.file_extension return os.path.join(path, format) 

Du musst eine FileField mit dem upload_to , die einen Callback anruft, siehe [1]

Ihr Rückruf sollte eine Wrapper-Methode anrufen, die eine Instanz als einen der Params und Dateinamen wie die andere bekommt. [2]

Ändern Sie es so, wie Sie es mögen und den neuen Weg zurückgeben [3]

1. LOGIK

 FileField(..., upload_to=method_call(params),....) 

2. Methode definieren

 def method_call(params): return u'abc' 

3. Wrapper:

 def wrapper(instance, filename): return method 

Dies ist die Rapper-Methode, die Sie brauchen, um die Instanz zu bekommen.

 def wrapper(instance, filename): ... Your logic ... return wrapper 

Vollständiger Code

 def path_and_rename(path, prefix): def wrapper(instance, filename): ext = filename.split('.')[-1] project = "pid_%s" % (instance.project.id,) # get filename if instance.pk: complaint_id = "cid_%s" % (instance.pk,) filename = '{}.{}.{}.{}'.format(prefix, project, complaint_id, ext) else: # set filename as random string random_id = "rid_%s" % (uuid4().hex,) filename = '{}.{}.{}.{}'.format(prefix, project, random_id, ext) # return the whole path to the file return os.path.join(path, filename) return wrapper 

Aufruf zur Methode

 sales_attach = models.FileField("Attachment", upload_to=path_and_rename("complaint_files", 'sales'), max_length=500, help_text="Browse a file") 

Hoffe das hilft. Vielen Dank.

Wenn Sie möchten, dass Ihre Funktion wiederverwendbar ist:

 import hashlib import datetime import os from functools import partial def _update_filename(instance, filename, path): path = path filename = "..." return os.path.join(path, filename) def upload_to(path): return partial(_update_filename, path=path) 

Du musst es einfach so benutzen:

 document = models.FileField(upload_to=upload_to("my/path")) 
  • Django: Wie kann man Modelle aus der Datenbank aktualisieren oder neu laden
  • Wie man <span> anstelle von <li> tag produziert
  • Erstellen Sie eine Zeile des Datums beim Erstellen von Superuser
  • Django - wie kann ich eine Zelle in einer Tabelle in der admin * changelist * Schnittstelle bearbeitbar nur, wenn es null ist?
  • Bearbeiten des Modells ForeignKey als Inline in der Django-Administration?
  • Daten aus Form und Anzeige in Vorlage abrufen
  • Python ist die beste Programmiersprache der Welt.