0

Here is my view..

class SingleNewsView(ListView):
    model = News
    form_class = SearchForm
    template_name = "single_news.html"



    def get(self, request, pk, **kwargs):
        self.pk = pk

        self.pub_from = request.GET.get('pub_date_from')
        self.pub_to = request.GET.get('pub_date_to')
        self.crawlers = request.GET.get('crawler')

        print self.crawlers


        return super(SingleNewsView,self).get(request,pk, **kwargs)

    def get_context_data(self, **kwargs):

        context = super(SingleNewsView,self).get_context_data(**kwargs)
        context["form"] = SearchForm#(self.request.GET)
        context["something"] = News.objects.filter(category_id=self.pk).filter(published_date__range=(self.pub_from,self.pub_to), crawler=self.crawlers)

        return context

Here on the same page where this view is displayed I want the "Download CSV" option and want to download the csv of query returned by context["something"]. How can I do that ?? Any help..

I have also written view to download csv but confused..

def CSVView(request):
    response = HttpResponse(content_type="text/csv")
    response["Content-Disposition"] = 'attachment; filename=somefilename.csv"'

    writer = csv.writer(response)
    writer.writerow([News.objects.filter(what goes here ???])

    return response
karthikr
  • 97,368
  • 26
  • 197
  • 188
Aaeronn
  • 155
  • 1
  • 3
  • 12

2 Answers2

1

This is how I create a csv file, fill it and send it to template for download:

def my view():
...    ...    ...
output_file = open('path/new_file_name', 'wb')
writer = csv.writer(output_file, delimiter=';')  # Delimiter is not needed
# This is to show a "title" per column:
headers = ['column1', 'column2', 'column3', 'column4']  
writer.writerow(headers)
for item in item_list:  # Then add the info you need to the file from the objects
    writer.writerow('write what you need for each item')

response = StreamingHttpResponse(writer, content_type="text/csv")
response['Content-Disposition'] = 'attachment; filename="FILENAME.csv"'
return response

When you use StreamingHttpResponse and create the response like I show you, when you do the return response, automatically it should start to download the file you send back

AlvaroAV
  • 10,335
  • 12
  • 60
  • 91
1

Recently I have found django-queryset-csv library to be very useful. With this, your code comes down to:

from djqscsv import render_to_csv_response


class SingleNewsView(ListView):
    model = News
    form_class = SearchForm
    template_name = "single_news.html"

    def get(self, request, pk, **kwargs):
        self.pk = pk

        self.pub_from = request.GET.get('pub_date_from')
        self.pub_to = request.GET.get('pub_date_to')
        self.crawlers = request.GET.get('crawler')

        self.format = request.GET.get('format', False)

        # check for format query key in url (my/url/?format=csv)
        if self.format == 'csv':
            qs = News.objects.filter(category_id=self.pk)\
                             .filter(published_date__range=(self.pub_from,self.pub_to), crawler=self.crawlers)\
                             .values('id', 'name')
            return render_to_csv_response(qs)

        print self.crawlers

        return super(SingleNewsView,self).get(request,pk, **kwargs)

    def get_context_data(self, **kwargs):

        context = super(SingleNewsView,self).get_context_data(**kwargs)
        context["form"] = SearchForm#(self.request.GET)
        context["something"] = News.objects.filter(category_id=self.pk).filter(published_date__range=(self.pub_from,self.pub_to), crawler=self.crawlers)

        return context

Of course you need to use your own column names that you want to output, instead of id, name..

Now since I don't see how you render the download csv button, I can't tell you how to add format key to it's url..

mariodev
  • 13,928
  • 3
  • 49
  • 61