2

我有用户提交了我试图写入文件然后保存到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实例都以大致相同的路径保存。IE。当第二条根本不应该存在时,一条路径将是'content/revisions/test.txt',另一条路径将是。'content/revisions/test_1.txt'

是什么赋予了?

4

1 回答 1

3

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

'/'.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 不负责覆盖文件系统上存在的文件,这就是为什么它通过添加后缀自动将其存储在唯一路径中的原因。

如果此行为不适合,请考虑编写自定义文件存储

于 2011-12-27T22:38:44.997 回答