2011-01-31 65 views
1

我试图创建一种'媒体管理器'模型,它将允许用户上传不同的国王媒体(图像,swfs,pdfs)类似于WordPress的方式。我的媒体模式看起来是这样的:Django - FileField和图像

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()方法时,模型将调整大小并裁剪图像,上传并使用url填充数据库到文件。

我也想确保上传的图像是在后期处理(裁剪等)后完成的,我没有必要保留原始文件。

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

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

希望有人能帮助:)

回答

4

图像上传之前你不能做任何事情(因为你什么都没有一起工作)。

但是如果你想将其保存到数据库之前修改图像,你可以在模型的save做()方法​​,调用父的save()

如果您是通过管理员上传,重写方法save_model(前)在admin.py中,即:

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) 
+0

@tovmeod +1对于用户名 – AllTradesJack 2014-07-29 23:21:21

1

在图像上传之前如何处理?这没有意义。直到您上传文件,服务器才能访问该文件。

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

+0

您可以在内存中编辑它。检查InMemoryUploadedFile – errx 2011-01-31 12:10:08

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“文档” Django的代码。 而在您的调整大小/裁剪功能,你应该使用StringIO不文件来保存结果