Ok, j'ai essayé à peu près tout et je n'arrive pas à faire fonctionner cela.
- J'ai un modèle Django avec un ImageField dessus
- J'ai du code qui télécharge une image via HTTP (testé et fonctionne)
- L'image est enregistrée directement dans le dossier 'upload_to' (le upload_to étant celui qui est défini sur ImageField)
- Tout ce que je dois faire est d'associer le chemin du fichier image déjà existant à ImageField
J'ai écrit ce code sur 6 façons différentes.
Le problème que je rencontre est tout le code que j'écris entraîne le comportement suivant: (1) Django créera un 2ème fichier, (2) renommera le nouveau fichier, en ajoutant un _ à la fin du fichier nom, puis (3) ne transférez aucune des données plutôt que de le laisser essentiellement un fichier renommé vide. Ce qui reste dans le chemin 'upload_to' est 2 fichiers, un qui est l'image réelle et un qui est le nom de l'image, mais est vide, et bien sûr le chemin ImageField est défini sur le fichier vide que Django essaie de créer .
Au cas où cela ne serait pas clair, je vais essayer d'illustrer:
## Image generation code runs....
/Upload
generated_image.jpg 4kb
## Attempt to set the ImageField path...
/Upload
generated_image.jpg 4kb
generated_image_.jpg 0kb
ImageField.Path = /Upload/generated_image_.jpg
Comment puis-je faire cela sans que Django essaie de re-stocker le fichier? Ce que j'aimerais vraiment, c'est quelque chose à cet effet ...
model.ImageField.path = generated_image_path
... mais bien sûr, cela ne fonctionne pas.
Et oui, je suis passé par les autres questions ici comme celle-ci ainsi que le doc django sur File
MISE À JOUR Après des tests supplémentaires, il ne fait ce comportement que lors de l'exécution sous Apache sur Windows Server. Lors de l'exécution sous le «runserver» sous XP, il n'exécute pas ce comportement.
Je suis perplexe.
Voici le code qui fonctionne avec succès sous XP ...
f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()
la source
Réponses:
J'ai du code qui récupère une image sur le Web et la stocke dans un modèle. Les bits importants sont:
C'est un peu déroutant car il est sorti de mon modèle et un peu hors contexte, mais les parties importantes sont:
Faites-moi savoir si vous avez des questions ou besoin d'éclaircissements.
Edit: pour plus de clarté, voici le modèle (moins toutes les déclarations d'importation requises):
la source
import urlparse
.os.path.basename(urlparse.urlparse(self.url).path)
. Merci pour le message, a été utile.prohibited to prevent data loss due to unsaved related object 'stream'.
Super facile si le modèle n'a pas encore été créé:
Première , copiez votre fichier image dans le chemin de téléchargement (supposé = 'chemin /' dans l'extrait suivant).
Seconde , utilisez quelque chose comme:
testé et fonctionnant dans django 1.4, il peut également fonctionner pour un modèle existant.
la source
Juste une petite remarque. La réponse tvon fonctionne mais, si vous travaillez sur Windows, vous voudrez probablement
open()
le fichier avec'rb'
. Comme ça:ou vous obtiendrez votre fichier tronqué au premier
0x1A
octet.la source
Voici une méthode qui fonctionne bien et vous permet également de convertir le fichier dans un certain format (pour éviter l'erreur "impossible d'écrire en mode P au format JPEG"):
où image est le django ImageField ou your_model_instance.image voici un exemple d'utilisation:
J'espère que cela t'aides
la source
Ok, si tout ce que vous devez faire est d'associer le chemin du fichier image déjà existant à ImageField, alors cette solution peut être utile:
Eh bien, si vous êtes sérieux, le fichier image déjà existant ne sera pas associé à ImageField, mais la copie de ce fichier sera créée dans le répertoire upload_to comme 'imgfilename.jpg' et sera associée à ImageField.
la source
with open('/path/to/already/existing/file', 'rb') as f:
obj.save()
Ce que j'ai fait était de créer mon propre stockage qui ne sauvera tout simplement pas le fichier sur le disque:
Ensuite, dans mes modèles, pour mon ImageField, j'ai utilisé le nouveau stockage personnalisé:
la source
Si vous souhaitez simplement "définir" le nom de fichier réel, sans encourir la surcharge de chargement et de ré-enregistrement du fichier (!!), ou sans recourir à un champ de caractères (!!!), vous voudrez peut-être essayer quelque chose comme ça - -
Cela éclairera votre model_instance.myfile.url et tous les autres comme si vous aviez réellement téléchargé le fichier.
Comme le dit @ t-stone, ce que nous voulons vraiment, c'est pouvoir définir instance.myfile.path = 'mon-nom de fichier.jpg', mais Django ne le supporte pas actuellement.
la source
La solution la plus simple à mon avis:
la source
Beaucoup de ces réponses étaient dépassées, et j'ai passé de nombreuses heures dans la frustration (je suis assez nouveau pour Django et le développement web en général). Cependant, j'ai trouvé cet excellent résumé par @iambibhas: https://gist.github.com/iambibhas/5051911
la source
Ce n'est peut-être pas la réponse que vous recherchez. mais vous pouvez utiliser charfield pour stocker le chemin du fichier au lieu d'ImageFile. De cette façon, vous pouvez associer par programme l'image téléchargée au champ sans recréer le fichier.
la source
Tu peux essayer:
la source
la source
la source
Travail! Vous pouvez enregistrer l'image en utilisant FileSystemStorage. consultez l'exemple ci-dessous
la source
Vous pouvez utiliser le framework Django REST et la bibliothèque de requêtes python pour enregistrer par programme l'image dans Django ImageField
Voici un exemple:
la source
Avec Django 3, avec un modèle comme celui-ci:
si l'image a déjà été téléchargée, nous pouvons directement faire:
ou
la source