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']))

これはすべて比較的うまく機能しますが、次の 2 つの問題があります。

1) ContentFileは、文字列の各文字の間にスペースを入れるので、;'test'になります。't e s t'

2) 何らかの理由で、ビューを実行するたびに、2 つのRevisionインスタンスがほぼ同じパスで保存されます。すなわち。1 つのパスは存在'content/revisions/test.txt'し、もう1 つのパスは'content/revisions/test_1.txt'2 番目のパスがまったく存在しない場合です。

何を与える?

4

1 に答える 1

3

まず第一に、そのようなものを使用してパスを作成しないでください:

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

しかし :

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

アプリケーションがUnix ライクなのWindowsなのかを知る必要はありません(そうです、Windows を Web サーバーとして使用している人もいます)。

FileFieldまた、 attributeを呼び出すべきではありません。pathこれは とあいまいFilePathFieldです。

これはフィールドNOT NULLですか?あなたのcreate()声明では、あなたはそれを提供していないからです。これにより、エラーが発生するはずです。

私はこれを取得しません:

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

何を達成しようとしていますか?GETパラメータをファイルに保存しますか?

あなたの質問に答えるために、デフォルトでは、Django はファイルシステムに存在するファイルを上書きする責任を負いません。これが、サフィックスを追加して一意のパスで自動的に保存する理由です。

この動作が合わない場合は、カスタム ファイル ストレージを作成することを検討してください。

于 2011-12-27T22:38:44.997 に答える