2011-06-14 22 views
8

我想在用戶上載圖片時在我的upload_to目錄路徑中包含用戶名。以下是我目前有 -在ImageField中獲取用戶名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路徑?

回答

19

upload_to可以是可調用的而不是字符串,在這種情況下,它將傳遞當前實例和文件名 - 請參閱documentation。像這樣的東西應該工作(instance.user.user,因爲instance.userUserProfile,所以instance.user.userUser)。

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) 
+6

這是正確答案的問題。但是,我會建議用戶的用戶名,而不是用戶名。你永遠不知道什麼時候你需要修改一個用戶名,這可能會帶來一些令人頭疼的問題。 – JeromeParadis 2012-08-14 21:04:12

+2

@JeromeParadis有一個使用id的問題,正如文檔所說:「在大多數情況下,這個對象還沒有被保存到數據庫中,所以如果它使用默認的AutoField,它可能還沒有它的值主鍵字段「。 https://docs.djangoproject.com/zh/dev/ref/models/fields/#django.db.models.FileField.upload_to – Caumons 2013-09-19 10:18:39

+0

@Caumons好點。在這種情況下,我假設UserProfile實例已保存,並且在另一個步驟中創建了頭像。在任何情況下,我認爲我的初始點有點模糊,因爲無論圖像保存在哪裏,路徑都存儲在ImageField對象中。唯一的問題是,如果允許更改用戶名,您將在圖像路徑和用戶名之間失去某種完整性。 – JeromeParadis 2013-11-15 15:52:36

0

伊斯梅爾巴達維的回答是完全正確的。你也可以使用新的字符串格式和lambda函數。

新字符串格式化:

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) 

新建字符串格式和lambda表達式:

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) 
相關問題