2017-09-27 153 views
1

每當我創建Cloth型號與cloth_image,圖像上傳到upload_location可以爲ImageField上傳位置的文件名是什麼?

我的問題是instance.id返回None,因爲該實例尚未創建。 什麼是ImageField的最佳上傳位置?

def upload_location(instance, filename): 
    new_id = instance.id 
    ext = filename.split('.')[-1] 
    return "clothes/%s/%s.%s" % (instance.user.id, new_id, ext) # <- Right Here! 

class Cloth(models.Model): 
    cloth_image = models.ImageField(upload_to=upload_location, 
           null=True, 
           blank=True) 

我正在使用AWS S3。

回答

1

,我認爲你可以使用uuid它,例如

import uuid 
import os 

def get_file_path(instance, filename): 
    base_dir = 'clothes' 
    user.id = str(instance.user.id) 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (uuid.uuid4(), ext) 
    return os.path.join(base_dir, user_id, filename) 
+0

我喜歡這個主意。如果uuid.uuid4()生成以前的ID呢?他們是否將以前生成的ID存儲到某個地方?如果不是,它只是隨機整數,不是嗎? –

+0

這是基於許多參數的綜合字段,你可以閱讀更多[uuid](https://docs.python.org/2/library/uuid.html) –

+0

嗯..確切地說。我想爲圖像文件名生成REAL唯一ID。 :( –

1

只需使用文件名而不是id,例如

os.path.join('clothes', instance.user.id, filename) 

不要擔心,如果文件名已經存在,Django會自動在末尾附加隨機字符串,以避免文件替換。

如果你想唯一的文件名
相關問題