파일이 어쨌든 장고를 통해 서비스를 제공해서는 안된다 (즉이 아닌 요청을 위해 특별히 생성) 정적 경우. 웹 서버가 제공하는 경로 (예 :/static /)를 구성하고 모든 django 오버 헤드를 저장해야합니다.
- 가 메모리에 생성하고 장고에서 봉사 :
파일이 동적 경우
2 가지 옵션이 있습니다.
- 디스크에 생성하고 HttpResponseRedirect를 반환하여 웹 서버가 다운로드 자체를 처리하도록합니다 (파일이 매우 큰 경우이 옵션을 사용해야합니다). 동적으로 역할에 관해서는
, 나는
import StringIO
from django.db.models.query import ValuesQuerySet, QuerySet
class CSVResponse(HttpResponse):
def __init__(self, data, output_name='data', headers=None, encoding='utf8'):
# Make sure we've got the right type of data to work with
valid_data = False
if isinstance(data, ValuesQuerySet):
data = list(data)
elif isinstance(data, QuerySet):
data = list(data.values())
if hasattr(data, '__getitem__'):
if isinstance(data[0], dict):
if headers is None:
headers = data[0].keys()
data = [[row[col] for col in headers] for row in data]
data.insert(0, headers)
if hasattr(data[0], '__getitem__'):
valid_data = True
assert valid_data is True, "CSVResponse requires a sequence of sequences"
output = StringIO.StringIO()
for row in data:
out_row = []
for value in row:
if not isinstance(value, basestring):
value = unicode(value)
value = value.encode(encoding)
out_row.append(value.replace('"', '""'))
output.write('"%s"\n' %
'","'.join(out_row))
mimetype = 'text/csv'
file_ext = 'csv'
output.seek(0)
super(CSVResponse, self).__init__(content=output.getvalue(),
mimetype=mimetype)
self['Content-Disposition'] = 'attachment;filename="%s.%s"' % \
(output_name.replace('"', '\"'), file_ext)
그냥 반환 CSVResponse (...)를 사용하여, 그것을 사용하려면 통과 (ExcelResponse의 단순화 된 버전입니다) 다음 코드를 사용하고 목록의 목록에서 (동일한 키를 사용하는) dicts 목록, QuerySet, ValuesQuerySet
시도해도 여전히 작동하지 않습니다. FireBug에서 응답과 헤더를 볼 수 있지만 대화 상자가 표시되지 않습니다. – spyder
현재 편집을 시도하십시오. – Cerin
나는 그것을 시도했지만 작동하지 않았다. 내 회신을 참조하십시오, 문제가 장고와 아무 관련이없는 것으로 나타났습니다. 감사합니다 – spyder