ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

FileField、ImageFieldでファイルアップロード先フォルダをユーザー毎に変更する

django1.0から、FileFieldとImageFieldのupload_to属性に関数を指定できるようになり、
ファイルのアップロード先を動的に設定できるようになったようだ。


http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField


関数の第一引数にはモデルオブジェクトが入り、第二引数にはファイル名が入る。


下記のようなモデルを作成することで、ユーザー名のフォルダに分けて
ファイルをアップロードすることができた。


models.py

import os
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
def get_photo_upload_path(self, filename):
root_path = "user/photos"
user_path = root_path + "/" + self.user.username
user_dir_path = settings.MEDIA_ROOT + "/" + user_path
if not os.path.exists(user_dir_path):
os.mkdir(user_dir_path)
return user_path + "/" + filename
class Photo(models.Model):
filename = models.CharField("File Name", max_length=100)
image = models.ImageField("Photo", upload_to=get_photo_upload_path)
user = models.ForeignKey(User, verbose_name="Owner User")