variable template examples django django-forms django-file-upload

template - Mostrar los contenidos(en lugar de guardar) de un archivo cargado con Django



django template variable (1)

¿Cómo puedo tener un formulario con un FileField, donde el archivo cargado no se guardará sino que se extraerá y se mostrará su contenido de texto?


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

Version corta:

  1. Su formulario de carga debe tener un campo forms.FileField .
  2. Cuando se envía el formulario, va a una URL que va a una función de vista que ha escrito. Esa función de vista toma una HttpRequest (generalmente llamada request ).
  3. Obtenga el archivo de request.FILES[] .

Por ejemplo, si su formulario tiene:

upFile = forms.FileField

Entonces su vista puede llegar al archivo con:

def uploadView(request): upFile = request.FILES["upFile"]

donde upFile es un objeto UploadedFile , que no es un objeto similar a un archivo. Un UploadedFile tiene las siguientes propiedades:

  • name : nombre del archivo cargado
  • size : tamaño en bytes

y los siguientes métodos:

  • read() : lee el archivo completo y regresa como una cadena. Probablemente sea bueno para usted, pero no se recomienda para archivos de más de 2.5 MB.
  • multiple_chunks() : devuelve True si el archivo debe manejarse como múltiples fragmentos.
  • chunks() : Devuelve un generador (utilícelo como un iterador) que devuelve los datos del archivo un fragmento a la vez.

Por lo tanto, siguiendo el ejemplo, si solo desea guardar el archivo en el disco, puede escribir:

outFile = open("/tmp/uploadTest.txt", "w") if not upFile.multiple_chunks(): outFile.write(upFile.read()) else: for chunk in upFile.chunks(): outFile.write(chunk) outFile.close()

En su caso, probablemente solo muestre un mensaje de error y descarte el archivo si multiple_chunks() devuelve True , ya que probablemente no esté buscando poner 2.5 MB de texto en su página.

EDITAR: Bueno, tu pregunta cambió completamente mientras escribía mi respuesta. Entonces, explicando cómo poner el contenido del archivo en la página, y suponiendo que el archivo no es más de 2.5 MB, su función de vista podría verse así:

def uploadView(request): upFile = request.FILES["upFile"] context = {} if upFile.multiple_chunks(): context["uploadError"] = "Uploaded file is too big (%.2f MB)." % (upFile.size,) else: context["uploadedFile"] = upFile.read() return render_to_response(''fileUploadPage.html'', context)

Añadiendo, por supuesto, cualquier otro procesamiento de vista que necesite.

Entonces su plantilla fileUploadPage.html necesita tener en alguna parte:

<div id="uploaded"> {% if uploadError %} <span class="error">{{ uploadError }}</span> {% else %} {{ uploadedFile }} {% endif %} </div>

EDICION 2: Dominic tiene un buen punto. Aquí está el código genérico de la plantilla para configurar la etiqueta del form derecha. Use esto en la plantilla que tiene la forma:

<form method="post" action="{% url uploadFile %}" {% if form.is_multipart %} enctype="multipart/form-data" {% endif %}> {{ form }} </form>

En su caso, dado que sabe que el formulario tendrá un archivo, puede perder el bloque if :

<form method="post" action="{% url uploadFile %}" enctype="multipart/form-data"> {{ form }} </form>

Nota: El comando {% url ___ %} incluirá la URL de una vista o URL con nombre. El parámetro es el nombre de la función de vista utilizada en su archivo urls.py , o el nombre dado al objeto url , así:

urlpatterns = patterns('''', url(''^uploadform$'', ''myapp.views.uploadFormView'', name=''uploadForm''), url(''^upload$'', ''myapp.views.uploadView'', name=''uploadFile''), # ... )