10

私はdjangoとpythonを初めて使用します。このクエストではいくつかのガイダンスが必要です。

ケース:ユーザーがフォームの送信ボタンを押すと、成功ページと結果をダウンロードできるリンクが表示されます。結果はExcelファイルにあります。xlwtモジュールを使用してExcelファイルへの出力を作成し、成功ページを個別に表示できますが、両方を同時に表示することはできません。

私が持っているもの:私はPython2.6を搭載したWindowsXPでdjango1.1.1を実行しています。同様の質問がありましたが、それを機能させることができませんでした。

私の成功page.htmlにはこの行があります

<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

リンクをクリックすると、パスエラーが発生します

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'

ところでexample.xlsはC:/example.xlsの場所と静的フォルダーの両方にあります

構造:

  • webdb
    • 静的
      • example.xls
    • Webinput
      • urls.py
      • views.py
      • models.py

これらの2つのモジュールもあります。backup_to_csvを使用すると正常に機能しますが、リンクなしで直接ダウンロードされます。私がすでにファイルを持っているときに同じことをする方法。ファイルを保存する必要がない他の方法がある場合は、それも問題ありません。

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(request、row):

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
4

3 に答える 3

10

今は動作しますが、ファイル拡張子をExcel(.xls)からcsvに変更する必要がありました。

私のurls.py=url(r'^static/example.txt', send_file)
私のHTMLリンク=<a href="../static/example.txt">Download CSV File</a>
私の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
于 2009-12-21T20:50:55.473 に答える
3

urls.pyの変更で

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

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

最初の例では、/の後のすべてを別のパラメーターとしてビューに渡しますが、ビューはこのパラメーターを受け入れません。別のオプションは、ビューでこのパラメーターを受け入れることです。

def send_file(request, path):
    ...

ただし、xlsファイルへのパスはハードコーディングされているため、必要ないと思います。

于 2009-12-19T08:49:30.273 に答える
1

コメントでOfriRaviv。あなたはそれがあなたに

TypeError:整数

これは、FileWrapperの作成中に、uが2つのパラメーターを渡しており、そのうち2番目のパラメーター[オプション]は整数であると想定されていますが、uは「rb」を渡したためです。

ラッパー=FileWrapper(file(filename)、 "rb")

これは実際には次のように記述する必要があります(「rb」はファイルへのパラメーターです)

ラッパー=FileWrapper(file(filename、 "rb"))

したがって、中かっこがずれているだけですが、デバッグが困難な場合があります。

于 2012-08-15T08:15:25.390 に答える