2017-06-01 93 views
1

我指的是youtube video,瞭解如何使用ImageField上傳圖片。他解釋瞭如何在保存圖像時使用instance.id。我試過了,但instance.id正在返回None。而對他來說,它的工作完美。以下是代碼:Django - 在上傳圖片時使用instance.id

#models.py 
import os 

def get_image_path(instance, filename): 
    return os.path.join(str(instance.id), filename) 

class AdProfile(models.Model): 
    name = models.CharField(max_length=100) 
    profile_image = models.ImageField(upload_to=get_image_path, blank=True, null=True) 

無論何時保存文件,其保存爲None/filename

即使是這樣,link也通知相同。我正在使用Django 10.5MySQL數據庫。

可能是什麼問題。請幫助。

+0

告訴你如何上傳文件,當'保存()覆蓋的Django模型'叫什麼名字? –

+0

我使用管理面板上傳了文件。它可以寫任何額外的'save()'方法。 – Jeril

+0

是的,這是你需要告訴管理員'save()'使用'get_image_path'的問題現在我正在寫答案.. –

回答

3

Django admin以某種方式調用get_image_path函數而不將模型保存到數據庫,因此id爲None。我們可以通過保存方法,並確保圖像保存和get_image_path獲得ID爲實例

class AdProfile(models.Model): 
    name = models.CharField(max_length=100) 
    profile_image = models.ImageField(upload_to=get_image_path, blank=True, null=True) 

    # Model Save override 
    def save(self, *args, **kwargs): 
     if self.id is None: 
      saved_image = self.profile_image 
      self.profile_image = None 
      super(AdProfile, self).save(*args, **kwargs) 
      self.profile_image = saved_image 
      kwargs.pop('force_insert') 

     super(AdProfile, self).save(*args, **kwargs) 
+0

你真棒。它按預期完美工作。非常感謝。 – Jeril

+0

很高興工作!謝謝! –

+0

有沒有辦法做同樣的事情,而使用'views.py'? – Jeril