11
votes

Renommer des fichiers dans Django Filefield

Je sais qu'il y a un fil très similaire ici, mais je ne trouve pas la solution à mon problème.

Je dois renommer un fichier enregistré dans django modèles.filefield P>

J'ai essayé Ceci p> xxx pré>

et cette p> xxx pré>

et de nombreuses autres voies, mais rien ne semblait aider. Un nouveau fichier est créé de toutes manières, cependant, les données de Filefield ne changent pas du tout. P>

Modifier: Résolu strong> P>

os.rename(old_path, new_path)
cursor = connection.cursor()
cursor.execute("UPDATE mods_mod SET direct_file = %s WHERE id = %s", [new_name, mod.id])
transaction.commit_unless_managed()


0 commentaires

5 Réponses :


2
votes

La documentation actuelle Django stipule:

"Lorsque vous accédez à un champ de fichier sur un modèle, vous recevez une instance de champ de terrain comme proxy pour accéder au fichier sous-jacent." Voir Docs pour une lecture supplémentaire.

Au lieu d'utiliser l'objet de fichier Python pour ouvrir le fichier, vous devez utiliser FieldFile.Open () pour ouvrir le fichier, puis manipuler le chemin du fichier en conséquence. Ensuite, enregistrez l'objet modèle et les modifications apportées au chemin doivent persister.


5 commentaires

La méthode ouverte ouvre un fichier déjà attribué. FieldFile n'a pas de méthode pour ouvrir un autre fichier.


Le fichier est attribué via le champ FileField, correct? Essayez-vous de modifier tous les fichiers de votre modèle ou d'une seule instance du modèle?


J'aimerais renommer le fichier direct_file = modèles.filefield (par défaut = aucune, vide = true, null = true, upload_to = "mod_files") téléchargé dans ce champ.


Il n'est toujours pas clair pour moi si vous essayez de renommer le champ modèle 'direct_file', ou si vous essayez de renommer le fichier réel stocké sur le système de fichiers. Ma réponse s'applique lorsque vous essayez de renommer le fichier stocké sur le système de fichiers.


Je veux renommer le fichier dans le système de fichiers.



14
votes

Je ne pense pas que vous devez utiliser SQL brut pour cela. Je pense que vous devez renommer le fichier à l'aide de la facilité OS , puis définissez le nom du fichier Filefield du modèle sur le nouveau nom. Peut-être quelque chose comme: xxx


1 commentaires

Cela ne fonctionnera que lorsque vous utilisez FileSystSorage .



2
votes
 new_name = 'photos_preview/' + str(uuid.uuid1())
 os.rename(photo.image_preview.path, settings.MEDIA_ROOT + new_name)
 photo.image_preview.name = new_name
 photo.save()

0 commentaires

1
votes

Je suis tombé sur cette question lorsque j'avais des blobs sauvés dans Django sans extension de fichier, et je voulais corriger cela. Mieux utilisé lors de la boucle sur un querySet filtré.

Vous ne pouvez pas modifier instance.picture.Path et essayer d'accéder à instance.picture.file. * Donnera une erreur car il tentera d'ouvrir l'ancien fichier. Instance de réglage.picture.name ne vous laissera toujours pas accéder à instance.picture.file. *, Même après l'enregistrement. P>

Vous pouvez simplement définir l'objet imagefield lui-même sur l'emplacement et tout fonctionnera: P >

(Testé avec Django 1.10) P>

import imghdr
import os

from django.db import models

class MyModel(models.Model):
    picture = models.ImageField()

instance = MyModel.objects.first()
if os.path.exists(instance.picture.path):
    extension = imghdr.what(instance.picture.path)
    os.rename(instance.picture.path, instance.picture.path + '.' + extension)
    instance.picture = instance.picture.name + '.' + extension
    instance.save()


0 commentaires

1
votes

Vous pouvez utiliser ce qui suit:

Supposons que «obj 'est l'objet Django que vous souhaitez renommer. Ensuite, faites ceci:

obj.file_field_name.name = new_name

obj.save ()


0 commentaires