Получение имени пользователя в ImageField upload_to path - PullRequest
8 голосов
/ 15 июня 2011

Я хотел бы включить имя пользователя в путь к каталогу upload_to, когда пользователь загружает изображение.Вот то, что у меня сейчас есть -

#model
class Avatar(models.Model):
    avatar = models.ImageField(upload_to='images/%s' %(USERNAME) )
     user = models.ForeignKey(UserProfile)

#form
class ProfilePictureForm(ModelForm):
    class Meta:
        model = Avatar
        fields = ('avatar',)

Как бы я получил USERNAME в модели, чтобы иметь возможность установить путь upload_to?

Ответы [ 2 ]

19 голосов
/ 15 июня 2011

upload_to может быть вызываемым вместо строки, в этом случае ему будет передан текущий экземпляр и имя файла - см. документацию .Нечто подобное должно работать (instance.user.user, потому что instance.user - это UserProfile, поэтому instance.user.user - это User).

def upload_to(instance, filename):
    return 'images/%s/%s' % (instance.user.user.username, filename)
class Avatar(models.Model):
    avatar = models.ImageField(upload_to=upload_to)
    user = models.ForeignKey(UserProfile)
0 голосов
/ 17 сентября 2017

Исмаил Бадави ответ полностью правильный. Также вы можете использовать новое форматирование строки и лямбда-функцию.

Новое форматирование строки:

def upload_to(instance, filename):
    return 'images/{username}/{filename}'.format(
        username=instance.user.user.username, filename=filename)


class Avatar(models.Model):
    avatar = models.ImageField(upload_to=upload_to)
    user = models.ForeignKey(UserProfile)

Новое форматирование строки и лямбда-функция:

 path = lambda instance, filename: 'images/{username}/{filename}'.format(
        username=instance.user.user.username, filename=filename)


class Avatar(models.Model):
    avatar = models.ImageField(upload_to=path)
    user = models.ForeignKey(UserProfile)
...