2011-05-30 7 views
15

Esta es mi forma:¿Qué no estoy haciendo bien en este formulario de carga de archivo django?

from django import forms 

class UploadFileForm(forms.Form): 
    titl = forms.CharField(max_length=50) 
    ffile = forms.FileField() 

Este es mi archivo views.py:

def handle_uploaded_file(file_path): 
    print "handle_uploaded_file" 
    dest = open(file_path.name,"wb") 
    for chunk in file_path.chunks(): 
     dest.write(chunk) 
    dest.close() 

def handle_upload(request): 
    c = {} 
    c.update(csrf(request)) 
    if request.method == "POST": 
     form = UploadFileForm(request.POST) 
     if form.is_valid(): 
      handle_uploaded_file(request.FILES["ffile"]) 
      return HttpResponseRedirect("/thanks") 
    else: 
     form = UploadFileForm() 
    c.update({"form":form}) 
    return render_to_response("upload.html",c) 

Y este es el contenido del Upload.html:

<form enctype="multipart/form-data" method="post" action="/handle_upload/"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Upload it"/> 
</form> 

Siempre que intento envíe el formulario, obtengo un "Este campo es obligatorio" para el campo ffile. ¿Qué estoy haciendo mal? Solo para mencionar, estoy cargando un archivo cada vez.

Respuesta

30
form = UploadFileForm(request.POST, request.FILES) 
+1

Enlace de documentación: https://docs.djangoproject.com/en/stable/ref/forms/api/#binding-uploaded-files – Flimm

43

Sólo para referencia futura. Tuve el mismo error, aunque incluí request.FILES en la inicialización de formularios. El problema estaba en la plantilla: olvidé agregar el atributo enctype="multipart/form-data" a la etiqueta <form>.

+7

Dios, cuántas cosas diferentes intenté antes de leer este :) You ' d creo que aprendería ... –

+0

Especificar el tipo de codificación en la plantilla también funcionó en una vista basada en clases, donde no se inicializa explícitamente el formulario para poder pasar 'request.FILES' como argumento. – Mariano

+0

¡Gracias a todos por esto! – Anubis

0

Si ha incluido request.FILES y añadió la enctype="multipart/form-data", pero son todavía viendo este error, podría ser que no está declarando la <input> correctamente.

Por ejemplo, si declaran explícitamente la entrada de html en su plantilla como:

<input type="file" value="Upload CSV File" /> 

El usuario no puede estar pasando el ID de entrada o de nombre atributos esperados del elemento de formulario de entrada.

Asegúrese de que su plantilla utiliza la etiqueta de elemento de formulario, es decir, {{ form.file }}, que django representará como: <input id="id_file" name="file" type="file" required=""> en la página.

Cuestiones relacionadas