Django: créer manuellement imagefield dans le model à partir du fichier existant sur le serveur
C'est de me tuer!
j'utilise django-filebrowser, et je veux créer une application galerie qui utilise ses capacités de téléchargement pour gérer les images.
j'ai une Galerie modèle qui permet à l'utilisateur de sélectionner ou de créer un répertoire sur le serveur, et télécharger des fichiers dans ce dossier apparaissent dans la galerie. Je veux automatiquement parcourir le répertoire dans lequel l'Utilisateur a téléchargé les images et les a sélectionnées, puis créer automatiquement des instances D'Image pour chaque image dans dossier.
class Gallery(model.Models):
gallerydirectory = FileBrowserField(...)
title = ...
description ...
class Image(model.Models):
image_field = models.ImageField()
le problème est que FileBrowser représente les images différemment de Django, mais je veux utiliser les ImageFields de DJango car je peux ensuite utiliser d'autres applications (vignettes sorl) sur la fin du modèle.
j'ai toutes les données nécessaires pour le fichier i.e. nom du fichier, chemin etc, Je ne peux pas obtenir Django pour créer une instance D'un champ Imag, sans télécharger l'image à nouveau. Je veux simplement la peupler.
j'ai vu un autre fil ici ce qui suggère ce qui suit:
for image in filebrowser_image_objects_list:
f = File(open('path-to-file-on-server','r'))
i = Image()
i.image_field('filename.png',f.read())
mais ce qui me donne un:
SuspiciousOperation error
Attempted access to '/filename.png' denied
ce qui suggère que le chemin n'est pas lu correctement. J'ai imprimé les attributs de L'objet File, et il ouvre la bonne image, il ne se transmet tout simplement pas au champ ImageField
L'aide serait grandement appréciée!
UPDATE
j'ai renoncé à essayer d'obtenir ce travail que c'est juste trop salissant. Le problème que j'ai eu ci-dessus était que j'avais configuré le champ upload_field du champ ImageField à '/' et qu'il était passé inaperçu signifiant que le fichier était écrit à '/something.png".
Je l'ai modifié pour que L'Image utilise maintenant un champ FileBrowserField au lieu d'un champ ImageField.
2 réponses
je note ceci comme répondu, car c'est la bonne façon de le faire:
image_model.image_field('path', File().read())
j'ai peut-être raté quelque chose, mais cela a fonctionné pour moi:
from a1.models import Model1
from django.core.files.images import ImageFile
m = Model1.objects.create()
m.f1 = ImageFile(open("1.png", "rb"))
m.save()
pour le modèle suivant:
class Model1(models.Model):
f1 = models.ImageField()
de Cette façon, il ne fonctionne pas:
m.f1('1.png', File.read(open('1.png', 'r')))
Il dit:
TypeError: 'ImageFieldFile' object is not callable
vérifié avec Django 1.7, 1.11.