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)
В таком случае вы сможете сохранять много изображений к одному товару, а также иметь одну основную фотографию для продукта.