2009-12-18 4 views
7

Je suis un nouveau à django et python. Besoin de conseils dans cette quête. Cas: Lorsque l'utilisateur appuie sur le bouton Soumettre d'un formulaire, il doit afficher la page Succès et un lien permettant de télécharger les résultats. Les résultats sont dans le fichier Excel. Je peux créer une sortie pour exceler le fichier en utilisant le module xlwt et afficher la page de succès individuellement mais pas les deux en même temps. Ce que j'ai: Je cours django1.1.1 sur Windows XP avec python 2.6. Il y avait une question similaire posée mais n'a pas été en mesure de le faire fonctionner.django télécharger le fichier csv en utilisant un lien

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 

Lorsque je clique sur le lien, il donne 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
    • Entrée Web
      • urls.py
      • views.py
      • models.py

je ces 2 modules. Si j'utilise backup_to_csv, cela fonctionne bien, mais il descend directement sans le lien. Comment faire la même chose quand j'ai déjà un fichier. S'il y a d'autres façons où je ne dois pas stocker le fichier, c'est 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 

Répondre

7

Maintenant cela fonctionne mais j'ai dû changer l'extension de fichier d'Excel (.xls) en 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 django.core.servers.basehttp 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 
2

Dans vos 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.

+0

Merci, mais il donne cette erreur Traceback (appel le plus récent en dernier): fichier "C: \ Python26 \ lib \ site-packages \ django \ core serveurs \ \ basehttp.py", ligne 280, en terme self.finish_response() fichier "C: \ Python26 \ lib \ site-packages \ django \ serveurs de noyau \ \ basehttp.py", la ligne 319, en finish_response de données en self.result: fichier « C : \ Python26 \ lib \ paquets-de-site \ django \ http \ __ init__.py ", ligne 378, dans le suivant chunk = self._iterator.next() Fichier" C: \ Python26 \ lib \ site-packages \ django \ core \ servers \ basehttp.py ", ligne 50, dans suivant data = self.filelike.read (self.blksize) TypeError: un nombre entier est requis – user234850

1

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

TypeError: an integer

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(file(filename),"rb")

ce qui devrait effectivement être écrit ('rb' est le paramètre de fichier)

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

il était juste un Misali gnment d'accolades, mais il est parfois difficile de déboguer.

Questions connexes