Saltar al contenido

Guardar imagen mediante programación en Django ImageField

Solución:

Tengo un código que recupera una imagen de la web y la almacena en un modelo. Los bits importantes son:

from django.core.files import File  # you need this somewhere
import urllib


# The following actually resides in a method of my model

result = urllib.urlretrieve(image_url) # image_url is a URL to an image

# self.photo is the ImageField
self.photo.save(
    os.path.basename(self.url),
    File(open(result[0], 'rb'))
    )

self.save()

Eso es un poco confuso porque se extrajo de mi modelo y está un poco fuera de contexto, pero las partes importantes son:

  • La imagen extraída de la web es no almacenado en la carpeta upload_to, en su lugar se almacena como un archivo temporal por urllib.urlretrieve () y luego se descarta.
  • El método ImageField.save () toma un nombre de archivo (el bit os.path.basename) y un objeto django.core.files.File.

Avíseme si tiene preguntas o necesita una aclaración.

Editar: en aras de la claridad, aquí está el modelo (menos cualquier declaración de importación requerida):

class CachedImage(models.Model):
    url = models.CharField(max_length=255, unique=True)
    photo = models.ImageField(upload_to=photo_path, blank=True)

    def cache(self):
        """Store image locally if we have a URL"""

        if self.url and not self.photo:
            result = urllib.urlretrieve(self.url)
            self.photo.save(
                    os.path.basename(self.url),
                    File(open(result[0], 'rb'))
                    )
            self.save()

Muy fácil si el modelo aún no se ha creado:

Primero, copie su archivo de imagen en la ruta de carga (asumido = ‘sendero/’ en el siguiente fragmento).

Segundo, usa algo como:

class Layout(models.Model):
    image = models.ImageField('img', upload_to='path/')

layout = Layout()
layout.image = "path/image.png"
layout.save()

probado y funcionando en django 1.4, podría funcionar también para un modelo existente.

Solo un pequeño comentario. tvon answer funciona pero, si está trabajando en Windows, probablemente desee open() el archivo con 'rb'. Como esto:

class CachedImage(models.Model):
    url = models.CharField(max_length=255, unique=True)
    photo = models.ImageField(upload_to=photo_path, blank=True)

    def cache(self):
        """Store image locally if we have a URL"""

        if self.url and not self.photo:
            result = urllib.urlretrieve(self.url)
            self.photo.save(
                    os.path.basename(self.url),
                    File(open(result[0], 'rb'))
                    )
            self.save()

o obtendrá su archivo truncado en la primera 0x1A byte.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *