2011-11-16 3 views
0

나는 이것을 3 일 동안 똑바로 작업했으며, 나는 지혜로 끝까지 노력하고있다. 나는이 과정에서 정확히 무엇이 일어나는 지, 그리고 각 단계에서 실제 데이터가 무엇인지 (또는 어떻게 보이는지)를 문자 적으로 단계별로 설명 할 누군가가 필요하다.Django에서 파일 업로드/처리

내부에 ImageField()가있는 모델이 있습니다. 그 모델을 기반으로 한 양식이 있습니다. 양식을 서식 파일로 전달하면 해당 서식 파일은 완성 된 양식 데이터를보기로 전달합니다. 그런 다음 요청을 바인딩합니다. 모델/폼의 인스턴스에 데이터를 저장하고 저장합니다.

내가하고 싶은 일은이 업로드 된 파일을 내 사용자의 프로필 사진으로 사용하고 모델에 저장하기 전에 크기를 조정하고 싶습니다.

데이터를 확인한 후 요청을 전달합니다. 파일 [ 'file'] 데이터를 함수로 가져오고이 함수의 내부에서 PIL이 데이터를 엽니 다. PIL은이 데이터를 InMemory 파일에서 직접 볼 때마다 아무런 문제가 없습니다. 그러나, 나는 편집 된 데이터를 장고가 ImageField()에서 찾고있는 것으로 출력하기 위해 PIL을 얻을 수 없다. 기본적으로이 업로드 된 데이터를 가져 와서 크기를 조정하고 이름을 변경 한 다음 ImageField()를 통해 저장하여 장고가 처리하도록합니다.

뷰 :

if request.method == "POST": 
    user_form = EditUserProfile(request.POST, instance=User.objects.get(id=request.user.id)) 
    siteprofile_form = EditSiteProfile(request.POST, request.FILES, instance=SiteProfile.objects.get(user=request.user)) 
    if user_form.is_valid() and siteprofile_form.is_valid(): 
     user_form.save() 
     temp_siteprofile = siteprofile_form.save(commit=False) 
     temp_siteprofile.profile_image = process_image_string(request.FILES['profile_image'], (100, 100)) 
     temp_siteprofile.save() 
     return user_profile(request, request.user.username) 

기능 :

def process_image_string(f, size): 
    f_image = Image.open(f) 
    f_image = f_image.resize(size) 
    output = StringIO() 
    f_image.save(output, "JPEG") 
    return output 

(내 눈)이이었다 함수가 지난 3 일 아마 100 번 변경을 명심하시기 바랍니다 내 가장 가까운 성공.

+0

당신이 위의 코드가 발생하는 오류를 제공하시기 바랍니다 수 있을까? – Paulo

+0

'cStringIO.StringO'객체에 '_committed'속성이 없습니다. –

답변

1

django-stdimage 시도해보십시오. 그것은 ImageField의 확장이며 당신을 위해 이미지 크기를 조정합니다, 여기에 예제 코드 조각입니다 :이

class MyClass(models.Model): 
    image1 = StdImageField(upload_to='path/to/img') # works as ImageField 
    image2 = StdImageField(upload_to='path/to/img', blank=True) # can be deleted through admin 
    image3 = StdImageField(upload_to='path/to/img', size=(640, 480)) # resizes image to maximum size to fit a 640x480 area 
    image4 = StdImageField(upload_to='path/to/img', size=(640, 480, True)) # resizes image to 640x480 croping if necessary 

    image_all = StdImageField(upload_to='path/to/img', blank=True, size=(640, 480), thumbnail_size=(100, 100, True)) # all previous features in one declaration 

, 당신은 직접 ModelForm EditUserProfile을 절약 할 수 있습니다, 당신은 어떤 이미지 조작을 직접 수행 할 필요가 없습니다. 단점은이 라이브러리가 PIL을 사용한다는 것입니다.

구글 코드 : http://code.google.com/p/django-stdimage/

Github에서 : https://github.com/humanfromearth/django-stdimage

+0

정말 감사합니다. 나는 이것을 줄 것이다. 그러나, 나는이 경험으로 정말 배우기를 원합니다. 그래서 나는 더 잘할 수 있습니다. –

관련 문제