Als we in Django een ImageField toevoegen aan een model gebruikt het de bestandsnaam van het originele bestand. Dit is niet ideaal voor applicaties waar gebruikers hun eigen foto’s kunnen uploaden. We kunnen dit oplossen door een functie te geven aan het argument “upload_to”. Het volgende voorbeeld vervangt de bestandsnaam door een automatisch gegenereerde bestandsnaam
import os
from uuid import uuid4
from django.utils.deconstruct import deconstructible
@deconstructible
class PathAndRename(object):
def __init__(self, sub_path):
self.path = sub_path
def __call__(self, instance, filename):
ext = filename.split('.')[-1]
# set filename as random string
filename = '{}.{}'.format(uuid4().hex, ext)
# return the whole path to the file
return os.path.join(self.path, filename)
# Then in your model
class Image(models.Model):
#... other fields
path_and_rename = PathAndRename('uploads/images/')
image = models.ImageField(upload_to=path_and_rename)