2010-05-21 24 views
1

我有模式:Django表單無法保存圖片文件

class OpenCv(models.Model): 
    created_by = models.ForeignKey(User, blank=True) 
    first_name = models.CharField(('first name'), max_length=30, blank=True) 
    last_name = models.CharField(('last name'), max_length=30, blank=True) 
    url = models.URLField(verify_exists=True) 
    picture = models.ImageField(help_text=('Upload an image (max %s kilobytes)' %settings.MAX_PHOTO_UPLOAD_SIZE),upload_to='jakido/avatar',blank=True, null= True) 
    bio = models.CharField(('bio'), max_length=180, blank=True) 
    date_birth = models.DateField(blank=True,null=True) 
    domain = models.CharField(('domain'), max_length=30, blank=True, choices = domain_choices) 
    specialisation = models.CharField(('specialization'), max_length=30, blank=True) 
    degree = models.CharField(('degree'), max_length=30, choices = degree_choices) 
    year_last_degree = models.CharField(('year last degree'), max_length=30, blank=True,choices = year_last_degree_choices) 
    lyceum = models.CharField(('lyceum'), max_length=30, blank=True) 
    faculty = models.ForeignKey(Faculty, blank=True,null=True) 
    references = models.CharField(('references'), max_length=30, blank=True) 
    workplace = models.ForeignKey(Workplace, blank=True,null=True) 

形式:

class OpencvForm(ModelForm): 
class Meta: 
     model = OpenCv 
     fields = ['first_name','last_name','url','picture','bio','domain','specialisation','degree','year_last_degree','lyceum','references'] 

和視圖:

def save_opencv(request): 
    if request.method == 'POST': 
    form = OpencvForm(request.POST, request.FILES) 
    # if 'picture' in request.FILES: 
    file = request.FILES['picture'] 
    filename = file['filename'] 
    fd = open('%s/%s' % (MEDIA_ROOT, filename), 'wb') 
fd.write(file['content']) 
    fd.close() 
    if form.is_valid(): 
     new_obj = form.save(commit=False) 
     new_obj.picture = form.cleaned_data['picture'] 
     new_obj.created_by = request.user 

     new_obj.save() 
     return HttpResponseRedirect('.')  
    else: 
     form = OpencvForm()  
    return render_to_response('opencv/opencv_form.html', { 
     'form': form, 
     }, 
     context_instance=RequestContext(request)) 

,但我似乎並沒有做保存圖片在我的數據庫...有什麼不對,我不知道什麼:(

回答

6

你不容易幫助你 - 你不會描述實際發生的事情。

但是我的猜測是你沒有在你的HTML form元素中包含enctype="multipart/form-data"

我會推薦閱讀the file upload documentation - 你正在做一些手動操作,可以由Django爲你處理。

+0

我在我的HTML形式加入ENCTYPE = 「多部分/格式數據」,但然後我的錯誤是: 'InMemoryUploadedFile' 目的是unsubscriptable – dana 2010-05-21 22:02:45

0

你的錯誤是在這裏:

filename = file['filename'] 

它應該是:

filename = file.name 
+0

你是對的,我錯了,但我的錯誤仍然存​​在: 'InMemoryUploadedFile'對象是unsubscriptable – dana 2010-05-22 10:44:17

1

我已經找到了解決辦法:

def save_opencv(request): 
    if request.method == 'POST': 
    form = OpencvForm(request.POST, request.FILES) 
    if form.is_valid(): 
     handle_uploaded_file(request.FILES['picture']) 
     new_obj = form.save(commit=False) 
     new_obj.created_by = request.user 

     new_obj.save() 
     return HttpResponseRedirect('.')  
    else: 
     form = OpencvForm()  
    return render_to_response('opencv/opencv_form.html', { 
     'form': form, 
     }, 
     context_instance=RequestContext(request)) 

和handle_uploaded_file:

def handle_uploaded_file(f): 
    destination = open('root', 'wb+') 
     for chunk in f.chunks(): 
     destination.write(chunk) 
    destination.close() 

請檢查縮進。 此外,在models.py我:

picture = models.ImageField(help_text=('Upload an image (max %s kilobytes)' %settings.MAX_PHOTO_UPLOAD_SIZE),upload_to='root',blank=True) 

請注意,我將其保存到根目錄,這意味着我的網站,沒有什麼相關的計算機文件組織的根。 另外,關於代碼沒有什麼大不了的,交易就是路徑 - 我真的不知道如何設置它。 無論如何,希望它可以幫助你。

0

更改此:

fd.write(file['content']) 

fd.write(file.read())