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

StackOverflow https://stackoverflow.com/questions/1627165

  •  06-07-2019
  •  | 
  •  

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

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

所有这些好处通常都可以通过使用 Flash 对象来解决。完整的解决方案在客户方面,例如:SWF上传http://swfupload.org/ , 花式上传 http://digitarald.de/project/fancyupload/, YUI 2 上传器 http://developer.yahoo.com/yui/uploader/ 可能还有更多。

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

因此,我有一些想法,但是我既不是Django的专家,也不是基于Flash的上传解决方案。我将在这里分享我的想法,以期从知识渊博和经验丰富的人那里得到一些反馈。(或者甚至只是一些“我也想要这个!”回复:))

您会注意到我做了一些假设:这是为了保持该应用程序的(初始)范围。这些假设当然值得商bat:

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

  • 如果要批量上传多个文件,则将拥有一个模型以包含每个文件。IE。该模型将包含一个文件字段或一个图像场。具有多个(但当然有限的)文件字段/ imageFields的模型不需要轻松的质量上载IMHO:如果您有100个文件字段的型号,您做错了什么:)示例您希望我设想的类型的质量上传:

    • 一个只有一个模型“小册子”的应用程序字段,标题字段(由文件名动态创建)和date_added字段。
    • 带有模型“图库”和“照片”的照片库应用程序。您选择一个画廊以添加图片,上传图片和新的照片对象,并将外国钥匙设置在选定的画廊中。
  • 能够为您喜欢的Flash上​​传解决方案配置或扩展应用程序的应用程序真是太好了。我们可以选择上面的三个默认设置之一,但可以实现该应用程序,以便人们可以轻松添加其他实现(例如Django,可以使用多个数据库)。让它与任何特定的客户端解决方案无关。

  • 如果我们需要选择一个开始,也许可以选择最小的足迹的一个?(客户端内容的最小下载)

  • 基于Flash的解决方案异步(并顺序或并行)将文件张贴到URL。我建议该URL是我们通用应用程序本地的URL(因此,您使用我们的应用程序的每个应用程序都是相同的)。该 URL 将转到我们的通用应用程序提供的视图。

  • 该视图将执行以下操作:创建一个新的模型实例,添加文件,可选地做额外的内容并保存实例。

  • DO EXTRA STUFF 是使用我们应用程序的应用程序想要运行的代码。如果模型只有一个文件字段/image字段,则不必提供任何额外的代码,标准视图代码将完成该作业。但是,大多数应用程序都想做我认为的额外工作,例如填写其他字段:标题、添加日期、外键、manytomany、...

  • 我还没有考虑过做额外的事情的机制。仅包装通用的应用程序视图就浮现在脑海,但这并不友好,因为您必须编写自己的URL模式和自己的视图。然后,您必须告诉Flash Solutions使用新的URL等...我认为这里可以使用信号之类的东西?

  • 表格/管理员:对于如何最好地集成到管理员或通用的django表单/小部件/...(这是我缺乏 Django 经验的表现):

    • 对于图库/照片应用程序:您可以在画廊详细信息表上提供大众照片上传小部件。但是如果 Gallery 实例尚未保存怎么办?文件上传视图将无法在照片实例上设置外汇。我看到auth应用程序,当您创建用户时,首先询问用户名和密码,然后才为您提供更大的表格,以填写emailadres,挑选角色等。我们可以做这样的事情。
    • 对于只有一个模型的应用程序:您如何在Django管理员中提供表格以进行大规模上传?您不能使用模型的详细表格来完成,这仅适用于一个模型实例。

在我启动此应用程序之前,可能需要回答更多问题。所以请告诉我你的想法!给我输入!你喜欢什么?什么不是?你会采取什么不同的做法?这个想法扎实吗?哪里不是呢?

谢谢你!

有帮助吗?

解决方案

大约一个月前,我刚刚为此发布了一个简单的应用程序: Django 上传.

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

{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %}

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

例如,假设您有一个模型“媒体”来处理所有用户上传的文件......

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’)

查看 维基百科 有关如何设置和创建信号处理程序(客户端/服务器)的信息。


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

  • 让应用程序自动创建“文件模型”实例可能并不像人们可能已经拥有自己正在使用的模型那样强大
  • 如果您想实现任何类型的安全或身份验证,您需要一个开放的系统,而不是“自动创建”类型
  • 我真的认为信号/事件是处理这个问题的方法,也可以处理你提到的“做其他事情”部分。
  • 我的结论是,从 Django 实现表单小部件的意义上来说,多重上传永远不可能真正成为表单小部件。1 个文件很可能由 1 个模型实例表示(有一些例外),这意味着我们最终会遇到 1 个小部件可以表示 N 个模型实例的情况。然而,Django 的设置是让一个小部件代表 1 个实例中 1 个字段的 1 个值。它只是不适合大多数用例将其作为小部件(因此我选择了模板标记路线)。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top