Django 1.7 ImageField表单验证

Django 1.7 ImageField表单验证,django,forms,validation,django-1.7,django-tests,Django,Forms,Validation,Django 1.7,Django Tests,我正在使用Django 1.7和Python 3.4编写单元测试。当注释掉文件\u数据元素时,下面的表单验证良好。如果包含文件\u数据,则无法验证,测试失败 from django.core.files.uploadedfile import SimpleUploadedFile ... data = { 'phone_number': '123456', 'job': Job.objects.latest('id').pk, } file_data = { 'port

我正在使用Django 1.7和Python 3.4编写单元测试。当注释掉
文件\u数据
元素时,下面的表单验证良好。如果包含
文件\u数据
,则无法验证,测试失败

from django.core.files.uploadedfile import SimpleUploadedFile
...

data = {
    'phone_number': '123456',
    'job': Job.objects.latest('id').pk,
}
file_data = {
    'portrait': SimpleUploadedFile(
        content=b'',
        content_type='image/jpeg',
        name='test.jpg',
    )
}
form = PersonForm(data, file_data)
self.assertTrue(form.is_valid())
类似的代码适用于
FileField
在我的站点的其他地方上传测试。在shell中运行代码时,我会以
的形式得到以下信息。错误
“上载有效图像。您上载的文件不是图像或已损坏的图像。
因此,我认为问题在于
内容
内容类型
字段。我尝试过在中使用image-as-a-string,但没有效果[编辑:图像作为字符串的方法实际上是答案,但我一定实施得很糟糕。已验证接受的答案有效。]我在列表中找不到任何线索

表单在现实中运行良好,但我想确保它包含在工作测试中,以便将来维护。理想情况下,我希望避免有一个实际的
test.jpg
文件存在,因为图像在我的
.gitignore
文件中,我不想开始破解目前非常顺利的自动部署


我应该给出什么样的输入才能正确地进行验证?

在测试套件和工作代码之间运行
Image
lib有什么区别吗?
Image
lib能否正确处理GIF等文件?您可能还需要检查
PIL/枕头的安装情况

SimpleUploadedFile(name='foo.gif', 
                   content=b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00')
对我有用

表单在内部依赖于
forms.ImageField
在其
中对图像进行测试,方法如下:

import io
from django.utils.image import Image
Image.open(io.BytesIO(image_content)).verify()
verify()
行中的任何异常都将导致错误
“上载有效图像…”
。您可以通过将图像字节分配给
image\u content
来检查图像字节:

image_content = b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00'
我也是

此外,您还可以在线生成图像字节:

import io    
from django.utils.image import Image
fp = io.BytesIO()
Image.new('P', (1,1)).save(fp, 'png')
fp.seek(0)
portrait = SimpleUploadedFile(name=''foo, content=fp.read())

奇怪的是,第一个解决方案马上就奏效了,但我敢发誓这是我尝试过的事情之一。我一定是在什么地方打错了字。谢谢