2010-05-21 47 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())