2017-04-12 127 views
0

在我的項目中,用戶可以上傳圖像,一旦保存,我可以運行post_save信號以使用Pillow修改圖像。修改圖像後,我需要用新圖像替換現有的圖像。現在的問題是,如果我在post_save信號中運行保存方法,它會導致最大的遞歸錯誤。所以,我正在考慮使用更新方法但會引發文件中字符的錯誤。如何使用新圖像更新Django模型中的ImageField

下面是代碼:

def menuImageLocation(instance,filename): 
     return "%s/%s"%(instance,filename) 

    class restaurantMenuImage(models.Model): 
    restaurant  = models.ForeignKey(restaurantCreateUpdate) 
    title  = models.CharField(max_length=100,null=True,blank=True) 
    menuImage = models.ImageField(upload_to=menuImageLocation,null=True,blank=True,verbose_name="Menu Image") 

    def __unicode__(self): 
     return str(self.restaurant)  

    @receiver(post_save,sender=restaurantMenuImage) 
    def modifyMenuImage(sender,instance,**kwargs): 

getRestaurant = restaurantCreateUpdate.objects.get(restaurantName=instance.restaurant) 
image_path = instance.menuImage.path 
filename = os.path.basename(image_path) 

image_hold = Image.open(image_path) 

image = image_hold.resize((300,300),Image.ANTIALIAS) 

temp_loc = "%s/%s/%s/tmp"%(settings.MEDIA_ROOT,"menu",getRestaurant.uniqueID) 

if not os.path.exists(temp_loc): 
    os.makedirs(temp_loc) 

temp_file_path = os.path.join(temp_loc,filename)  
if os.path.exists(temp_file_path): 
    temp_path = os.path.join(temp_loc,"%s" %(random.random())) 
    os.makedirs(temp_path) 
    temp_file_path = os.path.join(temp_path,filename) 

temp_image = open(temp_file_path,"w")   

image.save(temp_image,quality=80) 

temp_data = open(temp_file_path,"r") 

image_file = File(temp_data) 
instance.menuImage.save(filename, image_file) 

所以,如果我運行代碼的最後一行,這將導致到最大遞歸誤差,而不是使用保存方法,我嘗試使用更新文件的方法路徑,但爲此我得到的錯誤,字符超過了「image_file」的max_length。請感謝任何幫助。

感謝先進!

回答

0

在運行最後一行之前,請添加一個檢查,如果實例的圖像路徑與新圖像路徑不相同。然後代碼將只運行一次。你的問題發生了,因爲你的post_save信號中的代碼總是在你的模型上調用保存時運行,這會創建一個無限循環。所以當你調用保存在你的post_save信號方法中時,你需要小心。

像這樣的東西應該有所幫助:

if instance.menuImage != image_file: 
    instance.menuImage.save(filename, image_file) 
相關問題