2010-02-26 3 views
1

Первоначальная история

Я пытаюсь выполнить загрузку файлов с помощью простой формы (я вставив зачищенный версию, но все важные детали включены):Django 1.1.1 давится многочастных/form-данных

<form method="POST" action="" enctype="multipart/form-data"> 
     <input type="file" name="up_file" size="50"> 
     <input type="hidden" name="cpk" value="{{c.pk}}"> 
     <input type="submit" name="btn_submit"> 
    </form> 

Теперь серверный скрипт работает под WSGI получал странные значения для поля «КФК» и request.FILES был пуст пустые request.FILES и request.POST словари, поэтому я решил перейти к разработке сервер f или отладки.

Удивительно, но IPDB отладчик висит после ввода как request.POST и request.FILES и нажав клавишу ввода ... С другой стороны, когда я удалить ENCTYPE = «многослойную/форма-данные» из тега , Я могу проверить и request.POST и request.FILES, но, конечно, request.FILES пуст тогда.

(Также WSGI версия, кажется, исцелиться удалением ENCTYPE = "многочастных/формы-данных" ...)

Update

Я попробовал все комбинации Opera 10 // Firefox 3.5 , enctype = "multipart/form-data" // нет multipart/form-data и dev server // mod_wsgi. В результате enctype = "multipart/form-data", который разбивает шоу. Итак, теперь я собираюсь проверить Django bugtracker, если это известная проблема.

Тем временем, может быть, кто-то здесь может мне точку в правильном направлении

ответ

4

Вы, возможно, потребуется указать свой вид и код формы, как мы используем форму загрузки с enctype="multipart/form-data" в Django 1.1.1 с большим успехом.

Приложение, например, прекрасно работает в dev-сервере.

views.py

from django import forms 
from django.shortcuts import render_to_response 

class UploadForm(forms.Form): 
    cpk = forms.CharField(max_length=256) 
    f = forms.FileField() 

def my_upload_view(request): 
    if request.method == 'POST': 
     form = UploadForm(request.POST, request.FILES) 
     if form.is_valid(): 
      print "Got cpk",form.cleaned_data['cpk'] 
      print "Got file",request.FILES['f'].read() 
    else: 
     form = UploadForm() 
    return render_to_response('upload.html', {'form':form}) 

upload.html

<html> 
<body> 
    <form enctype="multipart/form-data" method="post"> 
     {{ form.f }} 
     {{ form.cpk }} 
     <input type="submit" /> 
    </form> 
</body> 
</html> 

Я использую экземпляр формы Джанго для отображения входного файла, но это делает очень часто <input type="file" name="f" id="id_f" />.

Используя этот образец, я получаю содержимое файла (я протестировал с использованием простого текстового файла), напечатанного на терминале с моего dev-сервера. Несколько подводных камней и тестов я могу рекомендовать являются:

  • убедитесь, что файл, который вы загружаете меньше settings.FILE_UPLOAD_MAX_MEMORY_SIZE (по умолчанию 2.5 MB)
  • перепроверить, что вы не определили обработчик загружать пользовательские файлы, которые могут быть нарушающими процесс загрузки (settings.FILE_UPLOAD_HANDLERS)
  • попытаться загрузить очень простой файл (например, небольшой текстовый файл), чтобы увидеть, если проблема все еще сохраняется с чем-то базовым
  • использует инструмент для проверки необработанного HTTP-запроса/отклика (firebug сделает это за вас, и есть некоторые автономные приложения, которые будут действовать как прокси-сервер, чтобы помочь вам здесь). .. Иногда решение выпрыгивает, когда вы можете видеть необработанный трафик.

Если вы еще не нашли их, у django file upload docs есть достаточное количество примеров.

+0

Я только что попробовал вам фиктивное приложение - это stacks, если оно вставлено в мой проект, но отлично работает, если работать как автономный проект! Это объясняет все эти аномалии, я даже не подозревал, что в какой-то момент я могу нарушить обработку запросов Django. Спасибо! –