xpanta
xpanta

Reputation: 8418

Django, how to return a file after form submit?

I want to let the user submit a form with some filter criteria and respond with a csv file. This is my code:

template:

<form action="{% url 'filter_tracks' %}" method="get" id="filter-form">
    <various filter params>
    ...
    <a class="md-btn"  href="javascript:void(0)" onclick="$('#filter-form').submit();" id="csv_btn">Export</a>
</form>

views.py

filename = "TRACKS_EXP{x}_{z}.csv".format(x=int(time.time()), z=lang)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="{x}"'.format(x=filename)
response.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(response, delimiter=',', dialect='excel', quotechar = "\"", lineterminator='\r\n',)
for track in track_list:
    writer.writerow([...])

return response

Although it works,

I get the data inside my HTML page and not in a downloadable file.

What am I doing wrong?

Upvotes: 1

Views: 492

Answers (1)

Muhammed Sidan
Muhammed Sidan

Reputation: 331

This is something i do to send a file from django to client, This should work in your case too

import os
from django.conf import settings
from django.http import HttpResponse

def download(request, path):
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response

Upvotes: 1

Related Questions