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 Comentarios

  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

Dejar respuesta

Please enter your comment!
Please enter your name here