Django FileField.save()生成重复文件

时间:2011-12-27 20:52:14

标签: python django django-file-upload

我有用户提交的内容,我尝试写入文件,然后保存到FileField

所以我有一个模型,如下所示:

class Revision(models.Model):
    def custom_revision_file_path(instance, filename):
        return '/'.join(['content/revisions', filename])
    path = models.FileField(upload_to=custom_revision_file_path)
    document = models.ForeignKey(Document)
    ...

和创建实例的视图如下所示:

def handle_revisions(request): 
    document = Document.objects.get(id=request.GET['docid'])
    basename = os.path.basename(str(document.path))

    revision = Revision.objects.create(
        document = document,
    )
    revision.path.save(basename, ContentFile(request.GET['revision']))

这一切都比较好,但有两个问题:

1) ContentFile 在我的字符串中的每个字母之间放置一个空格,以便'test'变成't e s t';

2)由于某种原因,每次运行视图时,两个Revision实例都以大致相同的路径保存。即。一条路径为'content/revisions/test.txt',另一条路径为'content/revisions/test_1.txt',而第二条路径根本不存在。

是什么给出了?

1 个答案:

答案 0 :(得分:2)

首先,你不应该使用类似的东西来创建路径:

'/'.join(['content/revisions', filename])

但是:

os.path.join("my_dir", "my_subdir", ..., "filename.txt")

您不应该知道您的应用程序是在类Unix 上运行还是在 Windows 上运行(是的,有些人使用Windows作为网络服务器)。

此外,您不应该调用FileField属性path,这与FilePathField不明确。

这个字段是NOT NULL吗?因为在您的create()声明中,您没有提供。这应该引发错误。

我不明白:

revision.path.save(basename, ContentFile(request.GET['revision']))

你想要达到什么目的?您确定要在文件中存储 GET 参数吗?

要回答您的问题,默认情况下,Django不承担覆盖您文件系统上存在的文件的责任,这就是为什么它会通过添加后缀自动将其与unique path一起存储。

如果此行为不适合,请考虑编写custom file storage