2014-10-31 6 views
0

내가 관리자 페이지를 통해 업로드되는 650로 이미지 크기를 조정 modelAdmin의 save_model 메서드를 재정의하고 있습니다 :장고 파이썬 PIL 이미지 저장 - 깨진 이미지

def save_model(self, request, obj, form, change): 
    basewidth = 650 
    img = PIL.Image.open(form.cleaned_data['image_file']) 

    if img.size[0] > basewidth: 
     wpercent = (basewidth/float(img.size[0])) 
     hsize = int((float(img.size[1]) * float(wpercent))) 
     img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS) 

     img_filefield = getattr(obj, 'image_file') 
     random_image_name = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(30)) + '.jpeg' 
     img.save(random_image_name) 
     img_filefield.save(random_image_name, ContentFile(img)) 
     obj.save() 
    else: 
     obj.save() 

이는 이미지를 저장되어 있지만 이미지입니다 깨진 검은 이미지를 열면 "invalid image"가 표시됩니다.

위 코드에서 내가 뭘 잘못하고 있니?

답변

0

PIL 이미지가 장고 ImageField 유형과 다른 유형이라는 것을 알지 못했습니다.

def save_model(self, request, obj, form, change): 
    basewidth = 650 
    img = PIL.Image.open(form.cleaned_data['image_file']) 

    if img.size[0] > basewidth: 
     wpercent = (basewidth/float(img.size[0])) 
     hsize = int((float(img.size[1]) * float(wpercent))) 
     img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS) 

     img_file_lang = getattr(obj, 'image_file') 
     random_image_name = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(30)) + '.jpeg' 

     image_io = StringIO.StringIO() 
     img.save(image_io, format='JPEG') 

     img_file_lang.save(random_image_name, ContentFile(image_io.getvalue())) 
     obj.save() 
    else: 
     obj.save() 

할 것을 잊지 말아 : import StringIO

Skitz의 answer 덕분에, 나는 이런 식으로 해결할 수