django Télécharger le fichier csv en utilisant un lien
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
- statique
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
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.