2016-03-22 5 views
0

これは私のmodels.pyです:DjangoのImageFieldのパスに変数を設定するにはどうしたらいいですか?

class Group_Photo(models.Model): 

    group_id = models.ForeignKey(Group) 
    photo = models.ImageField(upload_to="static/image/group/" + group_id + "/") 

私はグループのためにあるディレクトリに画像をアップロードしたいと思います。 例えば、group_id = 3場合、

upload_to="static/image/group/3/"

私はどのようにすればよいですか?

申し訳ありませんが、これはエラーです。

File "/models.py", line 161, in Group_Photo photo = models.ImageField(upload_to="static/image/group/" + group_id + "/") TypeError: Can't convert 'ForeignKey' object to str implicitly

+0

このコードはエラーを起こしますか?あなたのコードを実行しようとすると何が出力されますか? – Renier

+0

@Renier申し訳ありませんが、私はエラーを書くのを忘れていました。追加した。 – yamachan

+0

@someone誰かが「いいえ、できません」と言った。複数のディレクトリに画像をアップロードできない場合は、1つのディレクトリにのみアップロードする必要がありますか? – yamachan

答えて

5

upload_to引数がas described in the documentation、関数とすることができる:

def group_based_upload_to(instance, filename): 
    return "image/group/{}/{}".format(instance.group.id, filename) 

class Group_Photo(models.Model): 
    group = models.ForeignKey(Group) 
    photo = models.ImageField(upload_to=group_based_upload_to) 

関数は、2つの引数を取る - ファイルが添付されたモデルのインスタンスと、ファイルの元の名前。それは、ファイルが保存される魔女の下で相対パスを返す必要があります。これは、MEDIA_ROOT設定で定義されたパスに追加されます。

上記の例では、グループの数値IDに基づいてディレクトリを使用しています。あなたは明らかに他のフィールドを使うことができます。例えば、スラッグを使用する場合は、instance.group.idinstance.group.slugに置き換えます。

+0

ありがとうございます。私の日本の文書はそれについて言及していない。私は今それを試みます。 – yamachan

+0

ありがとうございます。 runserverで起動したとき、エラーは発生しませんでした。後でアップロードフォームを実装します。 – yamachan

関連する問題