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

программно сохранение изображения в Django ImageField


возможно, я что-то пропустил, но это сработало для меня:

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.