1. ホーム
  2. python

[解決済み] 実行時に upload_to が決定される Django FileField

2022-05-18 04:52:30

質問

アップロードをセットアップして、ユーザーjoeがファイルをアップロードすると、すべてのファイルがMEDIA_ROOTに行くのではなく、MEDIA_ROOT/joeに行くようにしようとしています。問題は、これをモデルでどのように定義すればよいのかがわからないことです。以下は、現在どのように見えるかです。

class Content(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to='.')

つまり、upload_toとして'.'の代わりに、ユーザーの名前を指定したいのです。

Django 1.0 では、upload_to を処理するために独自の関数を定義できることは理解していますが、その関数もユーザが誰であるかは分からないので、少し迷っています。

助けてくれてありがとうございます!

どのように解決するのですか?

あなたはおそらく ドキュメント を読んだと思いますので、ここではそれを理解するための簡単な例を示します。

def content_file_name(instance, filename):
    return '/'.join(['content', instance.user.username, filename])

class Content(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to=content_file_name)

お分かりのように、与えられたファイル名を使う必要はありません。お望みであれば、upload_to callableでそれを上書きすることもできます。