我一直在尝试help(django.db.models.ImageField)
和dir(django.db.models.ImageField)
,寻找如何从上传的图片中创建ImageField
对象。
request.FILES
的图片为InMemoryUploadedFile
,但我正在尝试保存包含ImageField
的模型,那么如何将InMemoryUploadedFile
转换为ImageField
{1}}?
你如何找到这种类型的东西?我怀疑这两个类有一个继承关系,但是我必须做很多dir()
-ing才能知道我是否要看。
答案 0 :(得分:18)
您需要将InMemoryUploadedFile
保存到ImageField
,而不是将其“转为”ImageField
:
image = request.FILES['img']
foo.imagefield.save(image.name, image)
其中 foo 是模型实例, imagefield 是ImageField
。
或者,如果您要从表单中提取图像:
image = form.cleaned_data.get('img')
foo.imagefield.save(image.name, image)
答案 1 :(得分:3)
您是否尝试在ModelForm中执行此操作?
这就是我对文件字段的处理方法
class UploadSongForm(forms.ModelForm):
class Meta:
model = Mp3File
def save(self):
content_type = self.cleaned_data['file'].content_type
filename = gen_md5() + ".mp3"
self.cleaned_data['file'] = SimpleUploadedFile(filename, self.cleaned_data['file'].read(), content_type)
return super(UploadSongForm, self).save()
您可以将其作为示例,并在源代码中查看InMemoryUploadedFile类在初始化参数中需要的内容。
答案 2 :(得分:1)
您可以使用表单实例来实现具有文件上载字段的表单,这里是视图:
def form_view(request):
if request.method == 'POST':
form = FooForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return render_to_response('result.html')
return render_to_response('form.html', {
'form': form;
'error_messages': form.errors;
}
form = FooForm()
return render_to_response('form.html', {
'form': form;
}
form.save()将上传的文件与所有其他字段一起保存,因为在其构造函数中包含 request.FILES 参数。在你的模型中,你必须像这样定义 ModelForm 类的 FooForm 子类:
class FooForm(ModleForm):
Meta:
model = Foo
...其中Foo是 Model 的子类,它描述了你想要持久存储的数据。