2017-06-01 91 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