2017-04-25 58 views
0

好吧,那個標題可能和模糊的東西一樣模糊,但我不能想出一些好東西。讓我解釋我的問題。Django,如何使用每個外鍵的新自動編號重命名圖像?

爲了解釋,我將以書籍爲例,僅僅因爲這很簡單。所以,想象我有這樣的2個模型:

class Book(models.Model): 
    title = models.CharField(max_length=100) 


class BookImage(models.Model): 
    book = models.ForeignKey(Book) 
    image = models.ImageField() 
    is_cover = models.BooleanField() 

現在,你可以看到一本書可以有多個圖像。我想將上傳的圖像重命名爲[書名] - [image-id] .jpg(或當然有任何圖像擴展名)。但是,我希望image-id在每本書中都是唯一的。如果這是有道理的。

所以,如果我有BookA,我想要的圖像被稱爲BookA-1,BookA-2和BookA-3等,並在BookB 1再次開始,BookB-1,BookB-2,BookB3等

任何想法我可以做到這一點?我一直在考慮這個問題,但我不能想出一個非常好的解決方案。起初,我認爲我可以指望圖像的數量,並添加1,但如果刪除圖像,則會遇到問題。我還想過在單獨的模型中跟蹤ID,但聽起來過於「複雜」。爲了讓事情變得更糟,我想要一次上傳多個圖像(好吧,圖像上傳是在Django管理中內聯的),所以它也必須能夠使用它...所以,我是想知道這裏有人有一個好主意嗎?有沒有簡單的解決方案?

我也一直在使用google搜索,但要麼沒有人有任何問題,或者我只是(很可能)不能拿出正確的搜索詞(以同樣的方式,我不能拿出一個正確的標題:P)。

感謝您的閱讀!

回答

0

冷杉你定義一個函數來處理上傳圖像,並將其傳遞給你的imagefield。

def book_image_upload(instance, filename): 
     book_title = instance.book.title 
     instance_id = instance.id 
     extension = filename.split(".")[-1] 
     new_filename = "%s-%s.%s" %(book_title, instance_id,extension) 
     new_filepath = "books/%s" %(new_filename) 
     return new_filepath 

class BookImage(models.Model): 
    book = models.ForeignKey(Book) 
    image = models.ImageField(upload_to=book_image_upload) 
    is_cover = models.BooleanField() 
+0

謝謝,但我知道如何更改上傳圖像的文件名。但是我想知道如何跟蹤文件名的id部分,我希望每本書都是獨一無二的,而不是所有書籍都是唯一的。也許我還不夠清楚......:/ – Landcross

+0

是否正在工作.. – Thameem

+0

你試過這段代碼嗎?它會產生預期的輸出。 – Thameem