2011-08-31 14 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モデルのimagefieldに新しいストレージを使用することになりました。 – dvw

+0

大丈夫です。あなたはそれが働くことを聞いてよかった! – randrumree

+0

コードに少し誤字があります。 dest.write(チャンク) –

関連する問題