Django - 你如何将InMemoryUploadedFile转换为ImageField的FieldFile?

时间:2009-02-03 02:46:36

标签: django image django-models upload

我一直在尝试help(django.db.models.ImageField)dir(django.db.models.ImageField),寻找如何从上传的图片中创建ImageField对象。

request.FILES的图片为InMemoryUploadedFile,但我正在尝试保存包含ImageField的模型,那么如何将InMemoryUploadedFile转换为ImageField {1}}?

你如何找到这种类型的东西?我怀疑这两个类有一个继承关系,但是我必须做很多dir() -ing才能知道我是否要看。

3 个答案:

答案 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 的子类,它描述了你想要持久存储的数据。

相关问题