Django应用程序,可以为其他应用程序提供用户友好的,多/大容量文件上传功能

hop*_*pla 7 django upload

我要说实话:这是我上周在Django-Users邮件列表上提出的一个问题.由于我还没有得到任何回复,我将它重新发布在Stack Overflow上,希望它能在这里获得更多关注.

我想创建一个应用程序,使您可以轻松地在自己的应用程序中进行用户友好,多个/大量文件上传.用户友好,我的意思是上传,如Gmail,Flickr,...用户可以在浏览文件对话框中一次选择多个文件.然后按顺序或并行上载文件,并在页面上显示所选文件的精美概述,旁边有进度条."取消"上传按钮也是一种可能的选择.

所有这些好处通常都是通过使用Flash对象来解决的.完整的解决方案是在那里的客户端,如:SWFUpload的 http://swfupload.org/,FancyUpload http://digitarald.de/project/fancyupload/ ,YUI 2提供者http://developer.yahoo.com/yui/uploader /可能还有更多.

当然,诀窍是将这些解决方案集成到您的项目中.特别是在像Django这样的框架中,如果你希望它可以重复使用,请加倍.

所以,我有一些想法,但我既不是Django的专家,也不是基于Flash的上传解决方案.我将在这里分享我的想法,希望从更有知识和经验丰富的人那里获得一些反馈.(或者甚至只是一些'我也想要这个!'回复:))

您会注意到我做了一些假设:这是为了控制应用程序的(初始)范围.这些假设当然值得商榷:

好吧,我的想法到目前为止:

  • 如果要批量上传多个文件,您将拥有一个包含每个文件的模型.即模型将包含一个FileField或一个ImageField.具有多个(但有限量)FileFields/ImageFields的模型不需要轻松大量上传imho:如果你有一个带有100个FileFields的模型你做错了什么:)你想要我想象的那种大量上传的例子:

    • 一个只有一个模型'Brochure'的应用程序,带有文件字段,标题字段(从文件名动态创建)和date_added字段.
    • 一个照片库应用程序与模型'画廊'和'照片'.您选择要添加图片的图库,上传图片并创建新的照片对象,并将外键设置为所选的图库.
  • 能够为您喜爱的Flash上​​传解决方案配置或扩展应用程序会很不错.我们可以选择上面三个中的一个作为默认值,但实现应用程序,以便人们可以轻松添加其他实现(有点像Django可以使用多个数据库).让它与任何特定的客户端解决方案无关.

  • 如果我们需要选择一个开头,也许选择占地面积最小的那个?(最小的客户端东西下载)

  • 基于Flash的解决方案异步(并且顺序或并行)将文件POST到URL.我建议将url设置为我们的通用应用程序的本地(因此,对于您使用我们的应用程序的每个应用程序,它都是相同的).该网址将转到我们的通用应用提供的视图.

  • 该视图将执行以下操作:创建新模型实例,添加文件,OPTIONALLY DO EXTRA STUFF并保存实例.

  • DO EXTRA STUFF是使用我们的应用程序的应用程序想要运行的代码.它不必提供任何额外的代码,如果模型只有FileField/ImageField,标准视图代码将完成这项工作.但大多数应用程序都希望做更多我认为的东西,比如填写其他字段:title,date_added,foreignkeys,manytomany,...

  • 我还没有想过DO EXTRA STUFF的机制.只想包装通用应用程序视图,但这不是开发人员友好的,因为您必须编写自己的url模式和自己的视图.然后你必须告诉Flash解决方案使用一个新的URL等...我觉得像这样的信号可以在这里使用?

  • 表单/管理员:我仍然非常粗略地说明如何将所有这些最好地集成到Admin或通用Django表单/窗口小部件/ ...(这是我缺乏Django体验节目):

    • 对于图库/照片应用程序:您可以在图库详细信息表单上提供大量照片上传小部件.但是如果Gallery实例还没有保存呢?文件上载视图将无法在Photo实例上设置foreignkeys.我看到auth应用程序,当你创建一个用户时,首先要求输入用户名和密码,然后只提供一个更大的表单来填写emailadres,挑选角色等.我们可以做类似的事情.
    • 对于只有一个型号的应用程序:如何在Django管理员中提供表单进行批量上传?您无法使用模型的详细信息表单,仅适用于一个模型实例.

在我开始使用这个应用程序之前,可能还有几十个问题需要回答.所以请告诉我你的想法!给我输入!你喜欢什么?什么不是?你会做什么不同的?这个想法是否稳固?它不在哪里?

谢谢!

T. *_*one 12

我刚刚在一个月前发布了一个简单的应用程序:django-uploadify.

它基本上是一个Django模板标记,充当非常漂亮的Uploadify(需要jQuery)的包装器.使用它就像将其添加到模板一样简单......

{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %}
Run Code Online (Sandbox Code Playgroud)

标记将在客户端和服务器端(Django信号)触发事件(每个文件1个),以指示何时收到传入文件.

例如,假设您有一个模型'Media'来处理所有用户上传的文件......

def upload_received_handler(sender, data, **kwargs):
    if file:
        new_media = Media.objects.create(
            file = data,
            new_upload = True,
        )
        new_media.save()

upload_recieved.connect(upload_received_handler, dispatch_uid=‘whatever.upload_received’)
Run Code Online (Sandbox Code Playgroud)

查看Wiki以获取有关如何设置和创建信号处理程序(客户端/服务器)的信息.


关于上面的概念实现,这里有几点需要考虑:

  • 让应用程序自动创建"文件模型"实例可能不像人们可能已经拥有自己的模型那样强大
  • 如果要实现任何类型的安全性或身份验证,则需要一个开放系统而不是"自动创建"类型
  • 我真的认为信号/事件是解决这个问题的方法,也可以处理你提到的'DO OTHER STUFF'部分.
  • 我的结论是,在Django实现表单小部件的意义上,多上传永远不会真正成为表单小部件.1个文件最有可能由1个模型实例表示(有一些例外),这意味着我们最终得到的情况是1个小部件可以代表N个模型实例.但是,设置Django以便小部件在1个实例中表示1个字段的1个值.它只是不适合大多数用例将它作为一个小部件(因此我去了模板标记路由).