2009-12-14 3 views
2

나는 'mugshot'이미지를 보유하고있는 사용자 프로파일 모델을 가지고 있습니다. modelForm을 사용하여 프로필 업데이트 양식을 제공하고 있습니다. 작업 양식을 작성하는 것은 쉬웠지만 이제 이미지에 몇 가지 비틀기가 필요합니다.ModelForm을 사용하여 이미지를 바꾸는 방법은 무엇입니까?

1) 사용자가 제공 한 파일 이름으로 저장됩니다. 오히려 사용할 파일 이름을 지정합니다. 나는 단지 모델의 PK와 같은 파일 확장자를 사용한다고 생각했다. 예 : "443.jpg"

2) 밑줄을 추가하지 말고 기존 이미지를 대체해야한다. "443 ___. jpg".

form = MemberProfileForm(request.POST, request.FILES, instance=request.member) 
    if form.is_valid(): 
     if request.FILES.get("image"): 
      form.image.name = 'poobar.jpg' 
     form.save() 
     return HttpResponseRedirect(reverse('my-profile')) 

그러나 '이미지'를 modelform (AttributeError)에 존재하지 않는

내가 재 작업해야합니까 :이 같은

class Member(models.Model): 
    home_phone  = models.CharField(max_length=10, blank=True) 
    image   = models.ImageField(upload_to='members', default="default.png") 
... 

class MemberProfileForm(forms.ModelForm): 
    home_phone  = AUPhoneNumberField(required=False) 

    class Meta: 
     model = Member 
     exclude = ('email','password','create_date','last_login','is_active') 

내가 기대했다 뭔가 걸리는 모든 것 이 작은 조정을 위해 "modelform"대신 "form"을 사용하는 것이 전부입니까, 아니면 이미지 저장을 제어하는 ​​쉬운 방법이 있습니까?

x --------------------------------------------- -------------------------------------------------- 내가 'request.member'을이 곳 대부분의 사람들은 아마, 'request.user'을 원하는 제외

이 그것을 해결하는 것 ...

form = MemberProfileForm(request.POST, request.FILES, instance=request.member) 
    if form.is_valid(): 
     if form.cleaned_data['image']: 
      (path, extension) = os.path.splitext(form.cleaned_data['image'].name) 
      form.cleaned_data['image'].name = ('%s%s' % (request.member.id, extension)) 
      request.member.image.delete() 
     form.save() 

.... 폼 인스턴스 kwarg 전달하여

답변

1

파일 업로드를 처리하고 자신의 위치를 ​​수정하는 방법에 대한 공식 장고 웹 사이트 documentation의 꽤 좋은 세트가있다. 파일 업로드 위치 처리에 관한 귀하의 질문에 대한 답변을 제공해야합니다.

이미지가 양식에 포함되지 않은 것은 cleaned_data 사전에 있습니다. form.cleaned_data['image']에 있습니다.

+0

오, 거기 우리가 간다. 그게 전부다. (1). 그런 다음 (2)에서 modelform 내부의 _image_ save 루틴에 'save = False'를 전달하는 방법을 볼 수 없지만 동일한 결과를 얻는 기존 이미지를 먼저 삭제할 수 있습니다. 해결책을 보여주는 편집 질문을보십시오. –

2

, 그것은 request.member 가정된다

form = MemberProfileForm(request.POST, request.FILES, instance=request.member) 
if form.is_valid(): 
    form.save() 

예컨대 멤버 인스턴스 이전 데이터를 덮어 알고

profile=Member.objects.get(user=request.user) 
form=MemberProfileForm(data=request.POST, files=request.FILES, instance=profile) 
+0

감사합니다. 그러나 문제는 귀하가 묘사 한 것과 정확히 몇 가지 문제를 극복하고자합니다. 이전 이미지를 덮어 쓰지 않습니다. (1)과 (2) 참조. –

관련 문제