Программно сохраняющий образ к Django ImageField

Это будет иметь никакой эффект.

Часть рекомендаций для записи CLS-совместимых библиотек не должна иметь двух общедоступных/защищать объектов, которые отличаются только случаем, например, Вы должны НЕ , имеют

public void foo() {...}

и

public void Foo() {...}

, что Вы описываете, не проблема, потому что частный объект не доступен пользователю библиотеки

192
задан Community 23 May 2017 в 01:54
поделиться

3 ответа

У меня есть код который извлекает изображение из Интернета и сохраняет его в модели. Важные части:

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()

Это немного сбивает с толку, потому что это вытащено из моей модели и немного вне контекста, но важные части:

  • Изображение, извлеченное из Интернета, не сохранено в папке upload_to он вместо этого сохраняется как временный файл с помощью urllib.urlretrieve (), а затем удаляется.
  • Метод ImageField.save () принимает имя файла (бит os.path.basename) и django.core. files.File объект.

Дайте мне знать, если у вас есть вопросы или вам нужны пояснения.

Изменить: для ясности, вот модель (за вычетом любых требуемых операторов импорта):

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()
161
ответ дан 23 November 2019 в 05:31
поделиться

Возможно, это не тот ответ, который вы ищете. но вы можете использовать charfield для хранения пути к файлу вместо ImageFile. Таким образом вы можете программно связать загруженное изображение с полем без повторного создания файла.

2
ответ дан 23 November 2019 в 05:31
поделиться

Небольшое замечание. tvon ответ работает, но, если вы работаете на windows, вы, вероятно, захотите open() файл с 'rb'. Например, так:

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()

иначе ваш файл будет усечен на первом 0x1A байте.

41
ответ дан 23 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: