Django формы я не могу сохранить файл изображения - PullRequest
1 голос
/ 21 мая 2010

у меня есть модель:

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

но я не сохраняю картинку в моей базе данных ... что-то не так, и я не могу понять, что: (

Ответы [ 5 ]

6 голосов
/ 22 мая 2010

Вам нелегко помочь - вы не даете описания того, что на самом деле происходит.

Однако я предполагаю, что вы не включили enctype="multipart/form-data" в свой элемент HTML form.

Я бы порекомендовал прочитать документацию по загрузке файлов - здесь вы делаете несколько вещей вручную, которые могут быть обработаны для вас Django.

2 голосов
/ 22 мая 2010

попробовать: filename = file.name!

http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

1 голос
/ 23 мая 2010

Я нашел решение:

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 голосов
/ 06 мая 2011

Изменить это:

fd.write(file['content']) 

до

fd.write(file.read())
0 голосов
/ 22 мая 2010

Ваша ошибка здесь:

filename = file['filename']

Должно быть:

filename = file.name
...