python - muestra - Django: crea manualmente un campo de imagen en el modelo a partir de un archivo existente en el servidor
manejo de imagenes django (2)
Estoy marcando esto como respuesta, ya que esta es la forma correcta de hacer esto:
image_model.image_field(''path'', File().read())
¡Esto me está matando!
Estoy usando django-filebrowser, y quiero crear una aplicación de galería que aproveche sus capacidades de carga para administrar imágenes.
Tengo un modelo de Galería que permite al usuario seleccionar o crear un directorio en el servidor, y cargar archivos a esa carpeta para que aparezcan en la galería. Quiero rastrear automáticamente el directorio en el que el usuario ha cargado las imágenes y seleccionado, y luego crear automáticamente instancias de imagen para cada imagen en la carpeta.
class Gallery(model.Models):
gallerydirectory = FileBrowserField(...)
title = ...
description ...
class Image(model.Models):
image_field = models.ImageField()
El problema es que FileBrowser representa las imágenes de forma diferente a Django, pero quiero usar DJango ImageFields, ya que luego puedo usar otras aplicaciones (miniaturas) en el extremo de la plantilla.
Tengo todos los datos necesarios para el archivo, es decir, nombre de archivo, ruta, etc., simplemente no puedo hacer que Django cree una instancia de un ImageField, sin volver a cargar la imagen. Simplemente quiero poblarlo.
He visto otro hilo here que sugiere lo siguiente:
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())
pero esto me está dando una
SuspiciousOperation error
Attempted access to ''/filename.png'' denied
lo que sugiere que el camino no se está leyendo correctamente. He impreso los atributos del Objeto de Archivo, y está abriendo la imagen correcta, simplemente no se pasa a ImageField
¡La ayuda sería muy apreciada!
ACTUALIZAR
He dejado de intentar hacer este trabajo porque es demasiado complicado. El problema que tenía anteriormente era que había configurado el campo de carga del campo de imagen en ''/'' y había pasado desapercibido, lo que significa que el archivo se estaba escribiendo en ''/something.png''.
Lo modifiqué para que la imagen ahora también use un FileBrowserField en lugar de un ImageField.
Puede que me esté perdiendo algo, pero esto me funcionó:
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()
para el siguiente modelo:
class Model1(models.Model):
f1 = models.ImageField()
De esta manera no funcionó:
m.f1(''1.png'', File.read(open(''1.png'', ''r'')))
Dice:
TypeError: ''ImageFieldFile'' object is not callable
Comprobado con Django 1.7, 1.11.