Django guardar imagen desde url y conectar con ImageField

Tengo en models.py:

class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()

Quiero django descargar automáticamente y guardar localmente la imagen de image_url y “conectar” con image_file

Cómo se debe actuar:

  1. Me Pegue https://docs.djangoproject.com/s/img/site/hdr_logo.gif
    en image_url campo en el administrador
  2. Haga clic en “guardar”
  3. En las plantillas de escritura <img src="{{ item.image_file.url }}">. Muestra
    la imagen de mi servidor, no djangoproject.com

Lo que he intentado:

He sobrescrito save método de Item clase. I imagen guardada localmente a través de urllib, pero estoy atascado en la conexión de esta imagen guardada con image_file campo

OriginalEl autor imkost | 2013-05-05

3 respuestas

  1. 35
    from django.core.files import File
    import os
    class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()
    ...
    def get_remote_image(self):
    if self.image_url and not self.image_file:
    result = urllib.urlretrieve(self.image_url)
    self.image_file.save(
    os.path.basename(self.image_url),
    File(open(result[0]))
    )
    self.save()

    Puede reemplazar la configuración predeterminada método save() para invocar automáticamente get_remote_image().

    Ver: https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

    ¿Cómo se establece el archivo de la imagen nombre?
    Python3 actualización: stackoverflow.com/questions/17960942/…

    OriginalEl autor Santiago M.

  2. 5
    from django.db import models
    from django.core.files import File
    from urllib.request import urlopen
    from tempfile import NamedTemporaryFile
    class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()
    ...
    def get_remote_image(self):
    if self.image_url and not self.image_file:
    img_temp = NamedTemporaryFile(delete=True)
    img_temp.write(urlopen(self.image_url).read())
    img_temp.flush()
    self.image_file.save(f"image_{self.pk}", File(img_temp))
    self.save()

    Esta solución evitar cualquier utf-8 errores recibidos durante url proceso.

    Sólo funciona con python 3.6+ debido a que el f de la cadena.

    Consulte este enlace: https://twigstechtips.blogspot.com/2012/04/django-programmatically-saving-image.html

    guarda mi vida, estaba buscando esto, gracias bro

    OriginalEl autor Raffaele Colace

  3. 3

    Para python3

    from django.core.files import File
    from urllib import request
    import os
    class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()
    ...
    def get_remote_image(self):
    if self.image_url and not self.image_file:
    result = request.urlretrieve(self.image_url)
    self.image_file.save(
    os.path.basename(self.image_url),
    File(open(result[0], 'rb'))
    )
    self.save()

    desde aquí: http://stackoverflow.com/questions/17960942/attributeerror-module-object-has-no-attribute-urlretrieve

    OriginalEl autor Chalist

Deja un comentario

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