【问题标题】:Django forms I cannot save picture fileDjango表单我无法保存图片文件
【发布时间】:2011-02-22 12:30:11
【问题描述】:

我有模型:

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

但我似乎没有将 图片 保存在我的数据库中...出了点问题,我不知道是什么:(

【问题讨论】:

    标签: database django forms insert image


    【解决方案1】:

    帮助你并不容易——你没有描述实际发生的事情。

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

    我建议阅读the file upload documentation - 你在这里手动做一些可以由 Django 为你处理的事情。

    【讨论】:

    • 我在 html 表单中添加了 enctype="multipart/form-data",但后来我的错误是:'InMemoryUploadedFile' 对象不可订阅
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      我找到了解决办法:

      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)
      

      请注意我将它保存到根目录,这意味着我的站点的根目录,而不是与计算机文件组织相关的任何内容。 另外,代码没什么大不了的,交易就是路径——一开始我真的不明白如何设置它。 总之,希望对你有帮助。

      【讨论】:

        【解决方案4】:

        你的错误在这里:

        filename = file['filename']
        

        应该是:

        filename = file.name
        

        【讨论】:

        • 你是对的,我错了,但我的错误仍然存​​在:'InMemoryUploadedFile' object is unsubscriptable
        【解决方案5】:

        改变这个:

        fd.write(file['content']) 
        

        fd.write(file.read())
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-21
          • 2011-02-24
          • 2017-10-21
          相关资源
          最近更新 更多