2016-06-09 85 views
1

我想更改上傳時的圖像名稱及其存儲位置。如何在django中更改文件的名稱和上傳的存儲位置

def name_func(instance, filename): 
    blocks = filename.split('.') 
    ext = blocks[-1] 
    filename = "%s.%s" % (instance.id, ext) 
    return filename 

class Restaurant(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4) 
    image_file = models.ImageField(upload_to=name_func,null=True) 

class Bar(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4) 
    image_file = models.ImageField(upload_to=name_func,null=True) 

這上傳所有的圖像文件到媒體文件夾,並賦予它實例的ID作爲名字。

現在我想要圖像文件上傳到兩個不同的子文件夾。所以,我嘗試使用系統filestorage:

fs_restaurant = FileSystemStorage(location='media/restaurant') 
fs_bar = FileSystemStorage(location='media/bar') 

,然後改變image_file領域:

image_file = models.ImageField(upload_to=name_func,null=True, storage=fs_restaurant) 

image_file = models.ImageField(upload_to=name_func,null=True, storage=bar) 

現在這個保存在正確的文件夾結構中的文件,但是,當我點擊管理面板中的鏈接時,鏈接不正確。這顯然是name_func函數,但我想知道是否有一種方法來糾正?在文檔中我找不到存儲類中的命名函數。

關於如何解決這個問題的任何想法?

回答

1

我認爲你的問題是你需要將子文件夾放在你的文件名上並返回。在您的數據庫中,文件名應該是來自STATIC_URLMEDIA_URL的文件的相對路徑。

下面是一個例子,我在那裏爲文件名生成一個UUID,並將其放在名爲app_images的子文件夾中。

def unique_filename(instance, filename): 
    path = 'app_images' 
    filetype = os.path.splitext(instance.image.name)[1] 
    new_filename = "{}{}".format(uuid.uuid4().hex, filetype) 
    while AppImage.objects.filter(image__contains=new_filename).exists(): 
     new_filename = "{}{}".format(uuid.uuid4().hex, filetype) 
    instance.filename = filename 
    return os.path.join(path, new_filename) 
+0

但後來我必須爲不同的類寫兩個單獨的函數,對吧? – Tom

+1

@PaulBernhardWagner這會工作,但你可能不需要,你可以檢查實例參數的類型,例如,如果type(instance)== Bar else'restaurant'',那麼'path ='bar'。我沒有親自嘗試過,但它可以工作。 – ARJMP

+0

那個作品,對不起,忘了接受,謝謝!! – Tom

相關問題