Django : Renommer les fichiers FileFields

La petite astuce du jour qui permet de manière élégante, je trouve, de renommer les fichiers enregistrés dans des « FileField ».

Cherchons à regarder comment ça fonctionne

Si nous nous penchons sur le code de FileField, nous pouvons constater cela dans le __init__ :

    def __init__(self, verbose_name=None, name=None, upload_to='', storage=None, **kwargs):
        #...
        if callable(upload_to):
            self.generate_filename = upload_to
 
        #...

Si upload_to est callable, donc une lambda ou une fonction par exemple, il y a un traitement particulier.

Regardons un peu plus loin :

    def save(self, name, content, save=True):
        name = self.field.generate_filename(self.instance, name)

Lorsque le fichier est sauvé (la fonction save est appelée), la méthode generate_filename est appelée avec 2 paramètres, l’instance de l’objet que l’on est en train de sauver et le nom du fichier.

Donc ?

Donc, si je passe en paramètre `upload_to` une lambda ou une fonction, celle-ci sera appelée pour récupérer le nom du fichier.

Petit exemple :

class MonModel(Model):
    my_file = models.FileField(upload_to=lambda instance, filename: '/'.join(['folder', str(instance.pk) + '-' + filename]))

Ce qui pourrait donner : `folder/37-monfichier.pdf`

Cela marche aussi pour la classe ImageField, étant donné qu’elle hérite de FileField ;).

Aymeric DERBOIS

J'ai 27 ans et je suis développeur. Je travail la plupart du temps sur des techno web, mais pas que. Étant à l'affût des nouveautés, j'adore découvrir tout et n'importe quoi dans l'informatique. Je suis amoureux de CakePHP et j'utilise au quotidien Django. Je suis très ouvert d'esprit :). J'aime bien utiliser AngularJS aussi de temps à autre pour faire du front. Au quotidien j'utilise Fedora/Ubuntu pour le desktop et CentOS pour mes serveurs. Par ailleurs je maîtrise le C/C++/Python/PHP/...

More Posts - Website

Follow Me:
Twitter

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.