2011-08-31 2 views
5

관련 질문을 살펴 보았지만 답변이 작동하지 않는 것 같습니다. 사용자의 프로필 이미지를 업로드하고 현재 이미지를 덮어 쓰려고합니다. 이미지를 저장할 때 파일 이름을 사용자 ID로 변경하고 싶습니다. 이미지가 현재 형태로 업로드되지만 기존 이미지를 대체하지는 않습니다 (예 : 2_1.png로 저장 됨). 여기Django ModelForm을 사용하여 프로필 이미지 업로드

class PhotoForm(forms.ModelForm): 
    def save(self): 
     content_type = self.cleaned_data['photo'].content_type.split('/')[-1] 
     filename = '%d.%s' % (self.instance.user.id, content_type) 

     instance = super(PhotoForm, self).save(commit=False) 
     instance.photo = SimpleUploadedFile(filename, self.cleaned_data['photo'].read(), content_type) 
     instance.save() 
     return instance 

    class Meta: 
     model = UserProfile 
     fields = ('photo',) 

def photo_form(request): 
    if request.method == 'POST': 
     form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile()) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = PhotoForm() 
    return render(request, 'photo_form.html', {'form': form}) 

답변

5
def photo_form(request): 
    if request.method == 'POST': 
     form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile()) 
     if form.is_valid(): 
      handle_uploaded_file(request.FILES['<name of the FileField in models.py>']) 

def handle_uploaded_file(f): 
    dest = open('/path/to/file', 'wb') # write should overwrite the file 
    for chunk in f.chunks(): 
     dest.write(chunk) 
    dest.close() 

검사 : https://docs.djangoproject.com/en/dev/topics/http/file-uploads/ 문제가 해결되지 않으면, 내가 양식이 승인되면 그냥 파일을 삭제 os.system을 사용할 수 같아요. 아마도 그렇게 큰 해결책은 아니 겠지만 작동해야합니다.

+0

감사합니다. 그 대답은 내가 만났지만 ModelForm이 저장을 처리하기를 원했습니다. 필자는 FileSystemStorage를 서브 클래 싱하여 기존 이미지를 덮어 쓰고 UserProfile Model 아래의 imagefield에 새 저장소를 사용하게되었습니다. – dvw

+0

오케이. 네가 듣는 것이 좋다! – randrumree

+0

코드에 약간의 오타가 있습니다. dest.write (청크) –