Модель Django с FileField - динамический аргумент 'upload_to'

Я использую модель с FileField для работы с загрузкой файлов. Теперь файлы могут быть загружены успешно. Тем не менее, есть еще одно небольшое улучшение, которое я хочу сделать, это создать папку для пользователя с именем пользователя.

Вот код, который я пробовал

class UserFiles(models.Model):
    user = models.OneToOneField(User)
    file = models.FileField(upload_to='files/users/user.username/%Y_%m_%d/')

это даст папку "user.username" вместо "John" (один пример имени пользователя)

Я также пробовал другие способы, как files/users/%user.username/%Y_%m_%d/ , но это не даст папку с именем пользователя. Не знаете, каким должен быть синтаксис или возможно ли это.

Можете ли вы дать некоторые предложения по этому поводу? Большое спасибо за вашу помощь и объяснение.

Ответ 1

Вместо строки попробуйте передать функцию:

def generate_filename(self, filename):
    url = "files/users/%s/%s" % (self.user.username, filename)
    return url

class UserFiles(models.Model):
    user = models.OneToOneField(User)
    file = models.FileField(upload_to=generate_filename)