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")