@sportik174

Как сохранить изображение в поле ImageField по url?

Есть изображение доступное например по такому url 'google.com/image.png'
Есть поле ImageField в модели Product

Как загрузить изображение в это поле ImageField чтобы потом можно было вывести его в шаблоне?
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
@sportik174 Автор вопроса
Загружаю изображение с помощью библиотеки Wget для Python
А в поле Imagefield записываю значение переменной filename
import wget
import os

directory = '../uploads'
url = collection_img
filename = wget.download(url)
os.rename(filename,os.path.join(directory,filename))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@pyHammer
sportik174 если изображение хранится удаленно, и острой необходимости скачивать его себе нет, то я обычно делаю так. Не использую ImageField, а использую CharField (или TextField в случае очень длинного URL), называю его например image_url. Далее я сохраняю весь URL в поле.
Вывести изображение в шаблоне можно вот таким образом
{% load thumbnail %}

{% thumbnail object.image_url "200x200" as im %}
    <img src="{{ im.url }}">
{% endthumbnail %}

для этого нужно установить sorl-thumbnail.
В качестве альтернативы object.image_url можно сделать что-то вроде этого, если нужно из модели получать объект файла
from django.db import models
from sorl.thumbnail import get_thumbnail

class Product(models.Model):
    image_url = ...

    @property 
    def image(self):
        return get_thumbnail(self.image_url, '200x200', crop='center', quality=75)

Но тут нужно учесть, что нужно передавать геометрию изображения.

Все это будет сохранятся в кеш, и в любой момент его можно сбросить и при следующем запросе изображения в шаблоне оно будет скачано с указанного URL.

Если же удаленное изображение нужно иметь у себя на сервере как копию, то просто скачиваем изображение например с помощью requests, сохраняем его в файл на сервере в папку MEDIA_ROOT, отрезаем все что до MEDIA_ROOT включая сам MEDIA_ROOT и сохраняем в поле часть пути в ImageField.
Например /home/project/project/media/images/image.jpg - это полный путь, а сохранить в ImageField нужно только images/image.jpg (или /images/image.jpg не помню точно).

P.S.
Для модели Product лучше сделать так:
class Product(models.Model):
    image = models.ForeignKey(ProductImage, on_delete=models.SET_NULL,
                                                  related_name='+', blank=True, null=True)

class ProductImage(models.Model):
    image_url = ...
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='images', null=True)

В таком случае вы сможете сохранять много изображений к одному товару, а также иметь одну основную фотографию для продукта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы