我有一些使用FileField的django模型,用户一直在管理界面中上传文件。我们现在有一个问题,一些文件很大(1-3G),这使得http上传很棘手。
有一个“容器”类,然后带有FK的“文件”类到容器。我在admin gui中使用了内联来使用户更容易(容器类窗体,带有文件类内联)
我找到了FilePathField,我认为将用户scp / rsync文件转发到服务器然后浏览并向其添加详细信息会很有用,但我怎样才能在管理员中获取此信息?我是否需要构建一个创建对象的新表单/视图?有没有办法以某种方式在自定义管理表单中覆盖模型(从而保持所有免费管理员的优点),用filepathfield替换文件字段?还有其他建议吗?
感谢您的任何建议!
答案 0 :(得分:2)
您提到FilePathField
有效,但需要重新启动网络服务器以查看新文件。发生这种情况是因为选项被收集FilePathField.__init__
,在导入模块时称为一次。
修复方法是重新调用表单__init__
中的字段__init__
:
def __init__(self, **kwargs):
super(MyForm, self).__init__(**kwargs)
self.fields['file'].__init__(path)
(这样每次表单实例化时都会扫描目录。)
答案 1 :(得分:0)
我不确定我是否理解您想要包含在管理区域中的内容。您是否正在寻找一种使用HTTP以外的传输协议自动执行文件上载过程的方法?
如果是这样,您可以使用基本CharField(或者可能是URLField)创建模型,然后在保存对象时执行rsync或scp副本。例如:
from django.db import models
class File(models.Model):
path = models.CharField()
def save(self):
import os
# WARNING! The path given by the user should be sanitized; this is
# example code only. This is a security vulnerability.
# Attempt to rsync the target file from a remote machine
exit_code = os.system("rsync %s /incoming/files/path/" % self.path)
# Make sure it worked before saving
if exit_code == 0:
super(File, self).save() # Call the "real" save() method
else:
# Raise exception
这是一个非常粗略的例子,但它应该可以帮助你解决问题。您需要确保您的例程是安全的(例如,格式错误的路径可能允许用户运行他们想要的任何内容)。此外,这可能会在复制文件时阻止Django保存例程,因此您应该在单独的过程中查看运行首选命令。
祝你好运!答案 2 :(得分:0)
我不是传输大文件的专家,但如果你的用户需要能够在没有“UNIX咒语”的情况下做到这一点,我建议考虑为它创建一个Java applet。这将是很多工作,但是你可以有适当的进度条等。