Django: вручную создайте imagefield в модели из существующего файла на сервере
это убивает меня!
Я использую django-filebrowser, и я хочу создать приложение галереи, которое использует его возможности загрузки для управления изображениями.
у меня есть модель галереи, которая позволяет пользователю выбирать или создавать каталог на сервере и загружать файлы в эту папку, чтобы появиться в галерее. Я хочу автоматически тралить каталог, в который пользователь загрузил изображения и выбрал, а затем автоматически создавать экземпляры изображений для каждого изображения в папка.
class Gallery(model.Models):
gallerydirectory = FileBrowserField(...)
title = ...
description ...
class Image(model.Models):
image_field = models.ImageField()
проблема в том, что FileBrowser представляет изображения по-разному для Django, но я хочу использовать Django ImageFields, поскольку я могу использовать другие приложения (миниатюры sorl) в конце шаблона.
у меня есть все данные, необходимые для файла, т. е. имя файла, путь и т. д., Я просто не могу заставить 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
помощь была бы очень признательна!
обновление
я отказался от попыток получить эту работу, так как это слишком грязно. Проблема у меня выше был, что я поставил upload_field из ImageField Для '/' и он ушел незамеченным, это означает, что файл был записан в '/что-то.png'.
Я изменил его так, что изображение теперь использует FileBrowserField вместо ImageField.
2 ответов
Я отмечаю это как ответ, так как это правильный способ сделать это:
image_model.image_field('path', File().read())
возможно, я что-то пропустил, но это сработало для меня:
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.