Django: вручную создать поле изображения в модели из существующего файла на сервере - PullRequest
18 голосов
/ 23 ноября 2010

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

Я использую 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 

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

Помощь будет с благодарностью признательна!

ОБНОВЛЕНИЕ

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

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

Ответы [ 2 ]

10 голосов
/ 01 ноября 2011

Я отмечаю это как ответ, поскольку это правильный способ сделать это:

image_model.image_field('path', File().read())

Программно сохранить изображение в Django ImageField

5 голосов
/ 11 сентября 2017

Я мог что-то упустить, но у меня это сработало:

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

Проверено с Джанго 1.7, 1.11.

...