这是在杀我!
我正在使用django-filebrowser,我想创建一个图库应用程序,利用它的上传功能来管理图像。
我有一个Gallery模型,允许用户在服务器上选择或创建目录,并将文件上传到该文件夹以显示在库中。我想自动搜索用户已将图像上传到的目录,然后选择该目录,然后自动为文件夹中的每个图像创建图像实例。
class Gallery(model.Models):
gallerydirectory = FileBrowserField(...)
title = ...
description ...
class Image(model.Models):
image_field = models.ImageField()
问题是FileBrowser表示图像与Django不同,但我想使用DJango ImageFields,然后我可以在模板端使用其他应用程序(sorl缩略图)。
我拥有该文件所需的所有数据,即文件名,路径等,我无法让Django创建一个ImageField实例,而无需再次实际上传图像。我只是想填充它。
我见过另一个帖子here,其中提出了以下建议:
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
非常感谢帮助!
更新
我已经放弃了尝试这项工作,因为它太乱了。我上面遇到的问题是我将ImageField的upload_field设置为'/'并且它没有被注意到意味着该文件被写入'/something.png'。
我已对其进行了修改,以便Image现在也使用FileBrowserField而不是ImageField。
答案 0 :(得分:10)
我将此标记为已回答,因为这是执行此操作的正确方法:
image_model.image_field('path', File().read())
答案 1 :(得分:5)
我可能会遗漏一些东西,但这对我有用:
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进行检查。
答案 2 :(得分:0)
这在具有Django 2的Python3上对我有效
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)