Cet article vous présente le problème du téléchargement de noms de fichiers dans FileField personnalisé via un exemple de code. Les amis intéressés peuvent s'y référer
L'attribut upload_to dans FileField peut définir le répertoire de stockage et le nom du fichier téléchargé. Il peut s'agir d'une chaîne ou d'un appelable, comme une méthode.
Lorsque la valeur de upload_to est définie sur une méthode, le nom du fichier téléchargé peut être modifié. La méthode nécessite deux paramètres, instance et filename, instance est l'instance de modèle à laquelle appartient FileField et filename est le nom du fichier téléchargé.
Exemple :
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)
Lorsqu'une classe définit la méthode __call__, elle peut également être appelée comme func, donc la valeur de upload_to peut également être une classe qui définit une méthode __call__.
Par exemple, pour ajouter un horodatage au nom du fichier en fonction de l'heure de téléchargement :
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)
Le FileField dans le modèle peut être défini comme suit :
class MyModel(models.Model): upload = models.FileField(upload_to=TimeStampFileName('media/'), )
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!