2011-02-15 6 views
2

이미지 업로드 기능이있는 대형 응용 프로그램을 작성하고 있습니다.Django : ImageField의 upload_to 속성을 사용하는 방법

여기 내 모델 :

class GallryImage(models.Model): 
    # ... 
    image = models.ImageField(max_length=255, upload_to='gallery', height_field='width', width_field='height') 
    width = models.IntegerField() 
    height = models.IntegerField() 
    # ... 

그리고 여기에 내가 업로드 처리하는 방법입니다 :

image_name = 'image.png'; 
destination = open(settings.MEDIA_ROOT + '/gallery/' + image_name, 'wb+') 
for chunk in f.chunks(): 
    destination.write(chunk) 
destination.close() 

이 코드는, 가지, 건조 원칙을 위반 - 경로 gallery는 두 번 반복된다.

질문 : 내 모델 (upload_to='gallery')에 지정된 경로를 다시 사용하여 업로드 처리기에서 반복 할 필요가 없습니까?

저는 파이썬 2.6과 장고 1.3 베타를 사용하고 있습니다.

감사합니다. 파울로의 답변에 따라

솔루션

모델의 인스턴스가 저장되면, 파일은 내가 할 일은 이것이다, 자동으로 업로드 :

def add(request): 
    from forms import ImageAddForm 
    form = ImageAddForm() 
    if request.method == 'POST': 
     form = ImageAddForm(request.POST, request.FILES) 
     if form.is_valid(): 
      image = GalleryImage(
       image = form.cleaned_data['image'] 
      ) 
      image.save() # file is uploaded to upload_to dir! 
      return HttpResponseRedirect(reverse('image_add') + '?image_added=') 
    else: 
     form = ImageAddForm() 

    return render_to_response('gallery/add.html', 
           locals(), 
           context_instance=RequestContext(request)) 
+0

왜 손으로 이미지를 저장하고 있습니까? 양식 프레임 워크가이를 처리해야합니다. –

+0

@Paulo Scardine, 답변으로 예제 (또는 링크)를 게시하면 매우 감사 할 것입니다. –

답변

5

forms framework은주의해야 당신을 위해 이것의. 파일 시스템이 아닌 다른 컨테이너에 파일을 저장하고 싶지 않으면 손으로 파일을 저장할 필요가 없습니다.

class UploadImageForm(forms.ModelForm): 
    class Meta: 
     model = GallryImage 
... 
# Sample view 
def upload_file(request): 
    if request.method == 'POST': 
     form = UploadImageForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/success/url/') 
    else: 
     form = UploadImageForm() 
    return render_to_response('upload.html', {'form': form}) 
+0

그리고 handle_uploaded_file()은 ...입니까? 문서를 자세히 읽는다면 하드 코딩 된 파일 경로를 포함하여 내가 게시 한 것과 동일한 작업을 수행하는 사용자 지정 함수입니다. –

+0

@silver light : ... 잘라 내기 및 붙여 넣기 오류! :-) form.save()는 이미지 필드를 처리해야합니다. –

+0

고마워요! 양식을 모델에 묶지는 않았지만 모델 자체를 저장하는 것이 트릭을 만들었습니다. –

관련 문제