开发者

Getting username in ImageField upload_to path

I would like to include the username in my upload_to directory path for when a user uploads an image. Here is what I cu开发者_开发技巧rrently have --

#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',)

How would I get the USERNAME in the model to be able to set the upload_to path?


upload_to can be a callable instead of a string, in which case it will be passed the current instance and the filename -- see the documentation. Something like this should work (instance.user.user because instance.user is the UserProfile, so instance.user.user is the 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)


Ismail Badawi answer is completely correct. Also you can use new string formatting and lambda function.

New string formatting:

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)

New String formatting and lambda function:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜