Подтвердить что ты не робот

Django: вручную создать imagefield в модели из существующего файла на сервере

Это убивает меня!

Я использую django-filebrowser, и я хочу создать приложение галереи, которое использует возможности загрузки для управления изображениями.

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

class Gallery(model.Models):
    gallerydirectory = FileBrowserField(...)
    title = ...
    description ...

class Image(model.Models):
    image_field = models.ImageField()

Проблема заключается в том, что FileBrowser представляет изображения по-разному для Django, но я хочу использовать DJango ImageFields, поскольку затем я могу использовать другие приложения (сорвать миниатюры) в конце шаблона.

У меня есть все данные, необходимые для файла, то есть имя файла, путь и т.д. Я просто не могу заставить Django создать экземпляр ImageField, не загружая изображение снова. Я просто хочу его заполнить.

Я видел еще один поток здесь, который предлагает следующее:

for image in filebrowser_image_objects_list:
    f = File(open('path-to-file-on-server','r'))
    i = Image()
    i.image_field('filename.png',f.read())

но это дает мне:

SuspiciousOperation error
Attempted access to '/filename.png' denied 

который предполагает, что путь читается неправильно. Я напечатал атрибуты объекта File, и он открывает правильное изображение, оно просто не передается в ImageField

Помощь будет очень оценена!

UPDATE

Я отказался от попыток получить эту работу, поскольку она слишком беспорядочна. Проблема, которая была у меня выше, заключалась в том, что я установил поле upload_field из ImageField в '/', и это оставалось незамеченным, означающее, что файл записывается в '/something.png'.

Я изменил его так, чтобы в Image теперь использовался FileBrowserField, а не ImageField.

4b9b3361

Ответ 2

Мне может что-то не хватает, но это сработало для меня:

from a1.models import Model1                                                               
from django.core.files.images import ImageFile
m = Model1.objects.create()                                                                
m.f1 = ImageFile(open("1.png", "rb"))      
m.save()

для следующей модели:

class Model1(models.Model):                 
    f1 = models.ImageField()

Таким образом, это не сработало:

m.f1('1.png', File.read(open('1.png', 'r')))

В нем говорится:

TypeError: 'ImageFieldFile' object is not callable

Проверено с помощью Django 1.7, 1.11.

Ответ 3

Это работает для меня на Python3 с Django 2

from urllib.request import urlopen
from urllib.parse import urlparse
from io import BytesIO
from django.core.files.images import ImageFile


from .models import ModelWithImageField

# Solving for SSL Error
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

url = https://www.someurl.com/image.png?other_params_if_they_exist
image_file_name = urlparse(url).path.split('/')[-1]
image_file_content = BytesIO(urlopen(url).read())
ModelWithImageField().image_field.save(image_file_name, image_file_content)