Heim > Artikel > Web-Frontend > Ausführliche Erläuterung des benutzerdefinierten FileField-Upload-Dateinamens
Dieser Artikel führt Sie anhand von Beispielcode in das Problem des Hochladens von Dateinamen in benutzerdefinierten FileField ein.
Das Attribut upload_to in FileField kann das Speicherverzeichnis und den Namen der hochgeladenen Datei festlegen. Es kann eine Zeichenfolge oder ein aufrufbarer Wert sein, z. B. eine Methode.
Wenn der Wert von upload_to auf eine Methode festgelegt ist, kann der Name der hochgeladenen Datei geändert werden. Die Methode erfordert zwei Parameter, Instanz und Dateiname. Instanz ist die Modellinstanz, zu der das FileField gehört, und Dateiname ist der Name der hochgeladenen Datei.
Beispiel:
def user_directory_path(instance, filename): # file will be uploaded to MEDIA_ROOT/user_<id>/<filename> return 'user_{0}/{1}'.format(instance.user.id, filename) class MyModel(models.Model): upload = models.FileField(upload_to=user_directory_path)
Wenn eine Klasse die __call__-Methode definiert, kann sie auch wie func aufgerufen werden, also der Wert von upload_to Es kann auch sei eine Klasse, die eine __call__-Methode definiert.
Um beispielsweise einen Zeitstempel zum Dateinamen basierend auf der Upload-Zeit hinzuzufügen:
import hashlib import os import time from django.utils.deconstruct import deconstructible @deconstructible class TimeStampFileName(object): def __init__(self, path): self.path = os.path.join(path, "%s%s") def __call__(self, instance, filename): extension = os.path.splitext(filename)[1] data = "%s_%d"%(filename,int(time.time())) file_hash = hashlib.sha1(data).hexdigest() return self.path % (file_hash, extension)
Das FileField im Modell kann definiert werden als folgt:
class MyModel(models.Model): upload = models.FileField(upload_to=TimeStampFileName('media/'), )
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des benutzerdefinierten FileField-Upload-Dateinamens. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!