2017-05-18 23 views
0

之前我在做這個應用程序,我需要一個用戶的圖像,然後利用水平從ImageOpsPillow庫翻轉。要做到這一點我做了一個模型,像上面:Django的1.11:水平翻轉圖片保存到一個Django模型

from django.db import models 


class ImageClient(models.Model): 
    image = models.ImageField(null=False, blank=False) 

我做了使用ImageField與HTML表單形式enctype="multipart/form-data",並在我的意見,我做了以下內容:

from django.shortcuts import render, redirect 
from .forms import ImageForm 
from .models import ImageClient 
from PIL import Image, ImageOps 

def new(request): 
    """ 
    Returns mirror image from client. 
    """ 
    if request.method == 'POST': 
     form = ImageForm(request.POST, request.FILES) 
     if form.is_valid(): 
      image = Image.open(form.cleaned_data['image']) 
      image = ImageOps.mirror(image) 
      form_image = ImageClient(image=image) 
      form_image.save() 
      return redirect('img:detail', pk=form_image.id) 
    else: 
     form = ImageForm() 
    return render(request, 'img/new_egami.html', {'form':form}) 
.... 

正如你看到的時候,一個檢查的形式是有效的,我打開窗體的形象和水平翻轉(使用ImageOps.mirror()),那麼我將它保存。但是,我總是收到此錯誤'Image' object has no attribute '_committed'。我知道Image object從枕頭,但我不明白這個錯誤。有人可以解釋和/或解決這個錯誤嗎?

+0

'ImageField'必須有一個'upload_to'屬性:'圖片=模型.ImageField(upload_to = '文件夾到上載照片/',空=假空白= FALSE)' – doru

回答

1

由於圖像是PIL Image對象而引發錯誤,而Django期待並要求擁有自己的File對象。您可以在圖像對象保存到一個絕對的文件路徑,然後引用它,但也有更有效的方法herehere。這是@ madzohan的回答後者鏈接適應您的圖像操作:

# models.py 

from io import BytesIO 
from django.core.files.base import ContentFile 
from PIL import Image, ImageOps 

class ImageClient(models.Model): 
    image = models.ImageField(null=False, blank=False, upload_to="image/path/") 

    def save(self, *args, **kwargs): 
     pil_image_obj = Image.open(self.image) 
     new_image = ImageOps.mirror(pil_image_obj) 

     new_image_io = BytesIO() 
     new_image.save(new_image_io, format='JPEG') 

     temp_name = self.image.name 
     self.image.delete(save=False) 

     self.image.save(
      temp_name, 
      content=ContentFile(new_image_io.getvalue()), 
      save=False 
     ) 

     super(ImageClient, self).save(*args, **kwargs) 

和views.py:

... 
if form.is_valid(): 
    new_image = form.save() 
    return redirect('img:detail', pk=new_image.id)