2010-01-06 15 views
30

Intentando usar un formulario muy simple para cargar un archivo en una nueva instancia de clase. Espero tener ambos archivos en request.FILES pero está vacío. Estoy en el servidor de desarrollo incluido.Solicitud vacía.FILES con Django Carga de formularios

Atascado aquí y pasé por todas las preguntas relacionadas.

wayfinder_map.media_file = request.FILES['media_file'] 

genera

MultiValueDictKeyError: "Key 'media_file' not found in MultiValueDict: {}>"

modelo

class WayfinderMap(models.Model): 
    """ Way-finding Map Config""" 


    media_file = models.FileField(upload_to="maps", null=True, blank=True) 
    wall_file = models.FileField(upload_to="maps_data", null=True, blank=True) 

vista

@login_required 
def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map/create.html"): 
wayfinder_map_form = form_class(request.user, request.POST or None, request.FILES) 

    if wayfinder_map_form.is_valid(): 
     wayfinder_map = wayfinder_map_form.save(commit=False) 
     wayfinder_map.media_file = request.FILES['media_file'] 
     wayfinder_map.data_file = request.FILES['data_file'] 
     wayfinder_map.creator = request.user 
     wayfinder_map.save() 
    return HttpResponseRedirect(wayfinder_map.get_absolute_url()) 

return render_to_response(template_name, { 
    "wayfinder_map_form": wayfinder_map_form, 
}, context_instance=RequestContext(request)) 

plantilla

<form enctype="multipart/form-data" class="uniForm" id="wayfinder_map_form" method="POST" action=""> 
     <fieldset class="inlineLabels"> 
      {{ wayfinder_map_form|as_uni_form }} 
      <div class="form_block"> 
       <input type="hidden" name="action" value="create" /> 
       <input type="submit" value="{% trans 'create' %}"/> 
      </div> 
     </fieldset> 
    </form> 
+0

Creo que las respuestas a esta pregunta similar le ayudarán: http://stackoverflow.com/q/5895588/1037459 –

Respuesta

2

Parece como request.FILES no es necesario en este caso (buena cosa porque es vacío ...)

he modificado esta línea

wayfinder_map.media_file = request.FILES['media_file'] 

para

wayfinder_map.media_file = wayfinder_map_form.cleaned_data['media_file'] 

y funciona. No estoy seguro de cuál es la forma correcta de hacer las cosas ... -

0

Creo que sus problemas pueden estar en la asignación de datos a una forma sin verificar primero la petición es POST

@login_required 
def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map create.html"): 
    if request.method=='POST': 
    wayfinder_map_form = form_class(request.user, data=request.POST, files=request.FILES) 

    if wayfinder_map_form.is_valid(): 
     #save your data 
     return HttpResponseRedirect(wayfinder_map.get_absolute_url()) 

    else: 
    wayfinder_map_form=form_class(request.user) 

return render_to_response(template_name, {"wayfinder_map_form": wayfinder_map_form,}, context_instance=RequestContext(request)) 
+0

estado usándolo de esta manera sin ningún problema hasta el momento. podría ser un buen control (si es necesario) pero ciertamente no resuelve el problema como request.FILES todavía está vacío – philgo20

+0

¿Qué quiere decir 'sin problemas hasta el momento'? ¿Esto funcionó correctamente antes? ¿Puedes publicar tu clase de formulario? – czarchaic

+0

Lo que quiero decir es que he estado usando formularios sin problemas, siempre que no tenga que usar request.FILES, sin verificar si el método es POST. ¿Atar la solicitud?POST a datos en la ejemplificación de la clase como lo haría podría ayudar? Lo intentaré y publicaré mi formulario. – philgo20

140

pregunta anterior, pero a alguien podría seguirle resultando útil.

Con el fin de tener su <input type=file> ficheros subidos y showns en request.FILES, el formulario debe contener enctype="multipart/form-data", por ejemplo:

<form action="" method="post" enctype="multipart/form-data">{% csrf_token %} 
{{ form.as_p }} 
<button type="submit">{% trans 'Submit' %}</button> 
</form> 

de lo contrario sus archivos no se cargarán y sus request.FILES estará vacía.

BTW Esa es una solución común a un error común. Sin embargo, todavía me encontré en una situación con un ARCHIVO vacío (y el archivo en el POST) cuando todo lo demás se veía bien. Tengo la sensación de que era un límite de tamaño, pero no quería pasar más tiempo depurando, y solo usé request.raw_post_data. Si alguna vez alguien se cae en este tema, por favor agregue un comentario (¡incluida la versión precisa de django!) E intentaré depurarlo más profundamente.

+0

yup, eso solucionó mi problema - gracias –

+14

No sé por qué esta no es la solución aceptada ... – Cerin

+3

Porque no resuelve el problema de los autores. – haudoing

Cuestiones relacionadas