Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django表单将PIL图像验证为ImageField_Django_Django Forms_Python Imaging Library - Fatal编程技术网

Django表单将PIL图像验证为ImageField

Django表单将PIL图像验证为ImageField,django,django-forms,python-imaging-library,Django,Django Forms,Python Imaging Library,假设我有一个支持文件上传的模型和表单: class Foo(Document): name = StringField() file = FileField() class FooForm(Form): name = CharField() file = ImageField() def save(self): Foo(name=self.cleaned_data['name'], file=self.cleaned_data['fi

假设我有一个支持文件上传的模型和表单:

class Foo(Document):
    name = StringField()
    file = FileField()


class FooForm(Form):
    name = CharField()
    file = ImageField()

    def save(self):
        Foo(name=self.cleaned_data['name'], file=self.cleaned_data['file']).save()
从实际浏览器发布时,
form.is\u valid()
返回
True
,因此我们可以调用
save()

当我使用
FooForm
拍摄
PIL
图像
(特别是
)时,
是有效的()
假的
,因为
表单错误
说明:

load a valid image. The file you uploaded was either not an image or a corrupted image.
以下是我试图保存表单的步骤:

img = ... our PIL image ...
post = {'name': name}
file = {'file': img}
form = FooForm(post, file)
if form.is_valid():
    form.save()
看看我做错了什么,导致
是有效的()
错误的


Edit:我认为这个问题更多的是关于将
PIL
Image
强制到
BaseForm
文件中

我建议将表单初始化更改为使用以下简单词典:

img = ... our PIL image ...
form = FooForm({'name': name, 'file': img})
if form.is_valid():
    form.save()

这最终成为我的解决方案,让
FooForm
正确验证。我相信有更好的方法

img = ... our PIL image ...
buffer = StringIO()
img.save(buffer, 'png')
buffer.seek(0)
image_file = SimpleUploadedFile('foo.png', buffer.read(), content_type="image/png")
buffer.close()
post = {'name': name}
file = {'file': image_file}
form = FooForm(post, file)
if form.is_valid():
    form.save()

为什么您要在这里麻烦地使用表单,而不是直接创建Foo对象?
FooForm
通过读取其他
form.cleaned\u数据来确定保存
Foo
的额外数据。把这个文件上传到系统的API。我认为问题在于
PIL Image
对于保存到
FileField
无效。不确定转换过程是什么。好问题。这只是返回表单。错误:
u'此字段(文件)是必需的。
。BaseForm的参数依次为
数据
(POST),然后是
文件
(文件)。我认为问题更多的是将
PIL
图像转换为
表单
考虑上传的文件。