2011-08-31 20 views
5

İlgili sorulara baktım ama cevapların hiçbiri işe yaramıyor. Bir kullanıcı için profil resmi yüklemeye çalışıyorum ve mevcut resmin yerini almasını (üzerine yazmasını) istiyorum. Görüntü kaydedildikten sonra dosya adını kullanıcı kimliğine değiştirmek istiyorum. Mevcut haliyle, resim yüklenecek, ancak mevcut resmin yerini almayacaktır (ör. 2_1.png olarak kaydedilecektir). BuradaDjango ModelForm kullanarak resim yükleme

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}) 

cevap

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() 

kontrol: https://docs.djangoproject.com/en/dev/topics/http/file-uploads/ Bu işe yaramazsa, ben formu kabul edilirse sadece dosyayı silmek os.system kullanabilirsiniz varsayalım. Muhtemelen bu kadar büyük bir çözüm olmaz ama işe yaramalı.

+0

Teşekkürler. Karşılaştığım bir cevaptı, ama ModelForm'un tasarruf etmesini istedim. Mevcut bir görüntünün üzerine yazmak ve UserProfile Modeli altındaki resim alanındaki yeni depoyu kullanmak için FileSystemStorage alt sınıflarını tamamladım. – dvw

+0

Tamam. İşe koyulduğunu duymak harika! – randrumree

+0

Kodunuzun biraz yazım hatası var. dest.write (yığın) –