Question

Je suis un nouveau pour django et python. Besoin de conseils dans cette quête.

Cas: Lorsque l'utilisateur clique sur le bouton soumettre un formulaire, il devrait afficher la page Succès et un lien où ils peuvent télécharger les résultats. Les résultats sont dans le fichier Excel. Je peux créer une sortie pour un fichier Excel en utilisant le module de xlwt et afficher la page de succès individuellement, mais pas les deux en même temps.

Ce que je: Je courais django1.1.1 sur Windows XP avec python 2.6. Il a été question similaire demandé  mais n'a pas pu le faire fonctionner.

mon page.html succès a cette ligne

<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

Quand je clique sur le lien, il donne l'erreur de chemin

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 est à la fois les emplacements C: /example.xls et dans le filtre statique

Structure:

  • webdb
    • statique
      • example.xls
    • Webinput
      • urls.py
      • views.py
      • models.py

Je ces 2 modules. Si j'utilise backup_to_csv cela fonctionne bien, mais il downlods directement, sans le lien. Comment faire la même chose quand je l'ai déjà un fichier. S'il y a d'autres façons où je ne dois fichier magasin, qui est très bien aussi.

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 (demande, ligne):

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
Était-ce utile?

La solution

Maintenant, il fonctionne, mais je devais changer l'extension de fichier Excel (.xls) au format CSV.

Mon urls.py = url(r'^static/example.txt', send_file)
Mon lien HTML = <a href="../static/example.txt">Download CSV File</a>
Mon 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

Autres conseils

Dans votre urls.py changement

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

à

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

Dans le premier, vous aussi Tout ce qui passe après la / à la vue comme un autre paramètre, mais votre point de vue n'accepte pas ce paramètre. Une autre option serait d'accepter ce paramètre dans la vue:

def send_file(request, path):
    ...

mais depuis le chemin vers votre fichier xls est codé en dur, je ne pense pas que vous avez besoin que.

Dans les commentaires Ofri Raviv. vous avez mentionné que son vous donnant un

  

TypeError: un nombre entier

qui est que, tout en créant FileWrapper u sont passé deux paramètres à partir de laquelle le second [facultatif] est censé être un nombre entier, mais u passé « rb »

  

= wrapper FileWrapper (fichier (nom de fichier), "rb")

Ce qui devrait effectivement être écrit ( « rb » est le paramètre de fichier)

= wrapper FileWrapper (fichier (nom de fichier, "rb"))

Il était juste un mauvais alignement des accolades, mais il est difficile de déboguer parfois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top