Django - FileField和图像

时间:2011-01-31 11:10:04

标签: django django-models

我正在尝试创建某种“媒体管理器”模型,该模型允许用户上传与WordPress类似的不同媒体(图像,swfs,pdfs)。我的媒体模型看起来像这样:

class Media(models.Model):
    id = models.AutoField(primary_key=True)
    url = models.FileField(upload_to="uploads")
    mimetype = models.CharField(max_length=64, editable=False)
    created = models.DateTimeField(auto_now_add=True, editable=False)

当用户上传文件时,我想先确定它是什么类型的文件,如果是图像,请进一步操作。我希望能够通过视图指定上传图像的尺寸(裁剪),因此当我调用.save()方法时,模型将调整大小并裁剪图像,上传图像并使用网址填充数据库到文件。

我还想确保在后处理(裁剪等)之后完成图像的上传,我不需要保留原始文件。

所以我要问的问题是如何将参数传递给FileFields保存方法(所以我可以传递图像后期处理的动态属性)以及如何确保在上传图像之前完成后期处理?

编辑:当我在图片上传之前说,我的意思是在它保存到它的最终目的地之前。我知道图像必须首先进入tmp文件夹才能发布它。对于误导性问题,我们深表歉意。

希望有人可以提供帮助:)

3 个答案:

答案 0 :(得分:4)

在上传图片之前,您无法执行任何操作(因为您无需使用任何内容)。

但是如果你想在将图像保存到db之前修改图像,你可以在模型的save()方法中执行它,然后再调用parent的save()

如果您通过管理员上传,请在admin.py中覆盖方法save_model(),即:

def save_model(self, request, obj, form, change):

        file =  request.FILES.get('url') # name of field
        if file:
            # proceed your code

        return super(AdminClassName, self).save_model(request, obj, form, change)

答案 1 :(得分:2)

以下是我的代码如何在实际上传之前更改文件。我想你应该明白我的想法

 from django.core.files.uploadedfile import InMemoryUploadedFile
#....
#some form
        def clean_avatar(self):
            av = self.cleaned_data['avatar']
            resized = make_avatar(av,65)   # My custom function than returns image
            return  InMemoryUploadedFile(resized, av.field_name, av.name, av.content_type, resized.len, av.charset)

您可以阅读InMemoryUploadedFile“documentation”的django代码。 在调整大小/裁剪功能中,您应该使用StringIO而不是文件来保存结果

答案 2 :(得分:1)

如何在上传图片之前完成处理?这没有意义。在您上传文件之前,服务器无权访问该文件。

如果您确实想在保存文件之前处理该文件,可以编写custom upload handler。在保存之前,您可以在那里测试文件是否是图像,然后适当地裁剪。 (您将需要Python Imaging Library来完成这两项任务。)