Pregunta

Soy nuevo en django y python.Necesitan algún tipo de guía en esta búsqueda.

Caso:Cuando el usuario pulsa el botón de enviar en un formulario, se debe mostrar el Éxito de la página y un enlace donde pueden descargar los resultados.Los resultados están en el archivo de excel.Puedo crear una salida a archivo de excel utilizando xlwt módulo y mostrar el éxito de la página de forma individual, pero no ambos al mismo tiempo.

Lo que tengo:Estoy corriendo django1.1.1 en windows XP con python 2.6.Allí fue similar pregunta pero no fue capaz de hacer que funcione.

mi éxito page.html tiene esta línea

<a href="../static/example.xls">Download CSV File</a>

urls.py:

url(r'^static/(?P<path>.*)$', send_file), 

views.py:

def send_file(request):

import os, tempfile, zipfile
from django.core.servers.basehttp import FileWrapper

"""                                                                         
Send a file through Django without loading the whole file into              
memory at once. The FileWrapper will turn the file object into an           
iterator for chunks of 8KB.                                                 
"""
filename = "C:/example.xls" # Select your file here.                                
wrapper = FileWrapper(file(filename),"rb")
response = HttpResponse(wrapper, content_type='text/plain')
#response['Content-Length'] = os.path.getsize(filename)
return response

Cuando hago clic en el enlace, da error de ruta de acceso

send_file() got an unexpected keyword argument 'path'
Request Method: GET
Request URL:    localhost:8000/webinput/static/example.xls
Exception Type: TypeError
Exception Value:    
send_file() got an unexpected keyword argument 'path'

BTW example.xls es en los lugares C:/example.xls y en la estática de la carpeta

Estructura:

  • webdb
    • Estática
      • example.xls
    • Webinput
      • urls.py
      • views.py
      • models.py

Tengo estos 2 módulos.Si yo uso backup_to_csv funciona bien pero downlods directamente sin el enlace.Cómo hacer lo mismo cuando ya tengo un archivo.Si hay otras maneras de donde no tengo para el archivo de almacén, que está muy bien también.

def xls_to_response(xls, fname):

response = HttpResponse(mimetype="application/ms-excel")
response['Content-Disposition'] = 'attachment; filename=%s' % fname
xls.save(response)
return response

def backup_to_csv(solicitud,fila):

response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename="backup.csv"'
writer = csv.writer(response, dialect='excel')    
#code for writing csv file go here...
for i in row:
    writer.writerow(i)
return response
¿Fue útil?

Solución

Ahora funciona, pero he tenido que cambiar la extensión del archivo de excel (.xls) a csv.

Mi urls.py=url(r'^static/example.txt', send_file)
Mi vínculo HTML=<a href="../static/example.txt">Download CSV File</a>
Mi view.py

def send_file(request):

  import os, tempfile, zipfile
  from wsgiref.util import FileWrapper
  from django.conf import settings
  import mimetypes

  filename     = "C:\ex2.csv" # Select your file here.
  download_name ="example.csv"
  wrapper      = FileWrapper(open(filename))
  content_type = mimetypes.guess_type(filename)[0]
  response     = HttpResponse(wrapper,content_type=content_type)
  response['Content-Length']      = os.path.getsize(filename)    
  response['Content-Disposition'] = "attachment; filename=%s"%download_name
  return response

Otros consejos

En su urls.py cambio

urls.py url(r'^static/(?P.*)$', send_file)

a

urls.py url(r'^static/example.xls$', send_file)

En el primero de ellos, que también están pasando todo después de la / a la vista como otro parámetro, pero su vista no acepta este parámetro.otra opción sería la de aceptar este parámetro en la vista:

def send_file(request, path):
    ...

pero desde la ruta de acceso al archivo xls es codificado, no creo que te necesito.

En los comentarios Ofri Raviv.usted mencionó que su dándole un

TypeError:un entero

que es porque mientras que la creación de FileWrapper u están pasando dos parámetros, de los cuales el segundo[opcional] se supone que ser entero pero u pasado 'rb'

contenedor = FileWrapper(file(archivo),"rb")

Que en realidad debería ser escrito como ('rb' es el parámetro Archivo)

contenedor = FileWrapper(archivo(archivo,"rb"))

Así que era sólo una mala alineación de los apoyos, pero hace que sea difícil para depurar a veces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top