2017-02-27 61 views
0
Link: <a href="{% url 'testing:export_csv' tr_details.tr_id %}">Export CSV</a> 

當我點擊錨鏈接時,我想導出csv文件,然後轉到確認頁面。在django上導出csv文件

{% extends "users/UserBar.html" %} 
{% load staticfiles %}<!--Loading for CSS sheet--> 
{% block css %} 
<link rel="stylesheet" type="text/css" href="{% static 'testing/style.css' %}" /> 
{% endblock css %} 

{% block title %}{{ tr_info.tr_id }} Export to CSV {% endblock title %} 
{% block header %}<a href="{% url 'testing:TrDetail' tr_info.tr_id %}">{{ tr_info.tr_id }}</a> Export to CSV {% endblock header %} 

{% if error_message %} 
    <p><strong>{{ error_message }}</strong></p> 
{% endif %} 

{% csrf_token %} 

{% block main %} 
    <p>The file has been export to CSV for tr id : {{ tr_info.tr_id }} </p> 
{% endblock main %} 

一切工作正常,直到這一步。

import csv 

from django.db import connections 

from django.http import HttpResponse 

from django.views.generic import ListView 

from testing.models import TrRunSummary, TrDetails 


class ExportCsv(ListView): 
    """Displays the different tests performed on the specified test request""" 
    template_name = 'testing/tr_export_csv.html' 
    context_object_name = 'export_csv' 

    def get_context_data(self, **kwargs): 
     context = super(ExportCsv,self).get_context_data(**kwargs) 
     context['tr_info'] = self.tr_info() 


     return context 

    def get_queryset(self): 
     qtr_id = self.kwargs['trID'] 
     s = str(qtr_id) 
     # print s 
     # print type(s) 

     cursor = connections['default'].cursor() 

     query =("SELECT results_stb_id, results_stbs.stb_id, stb_inv.mac_add, " 
     "test_functionality.test_functionality_code, test_cases.test_case_no, " 
     "SCRIPT.option_name AS script_result, POST.option_name AS post_result, " 
     "results_tests.started, results_tests.stopped, results_tests.test_duration, builds.baseline, " 
     "builds.build_type, stb_hw_info.stb_type, defects.defect_name, parser_output, log_url, " 
     "script_health_score, post_health_score FROM results_stbs " 
     "JOIN tr_test_cases " 
     "ON tr_test_cases.tr_test_case_id=results_stbs.tr_test_case_id " 
     "JOIN test_cases " 
     "ON test_cases.test_case_id=tr_test_cases.test_case_id " 
     "JOIN test_functionality " 
     "ON test_functionality.test_functionality_id=test_cases.test_functionality_id " 
     "LEFT JOIN stb_inv " 
     "ON results_stbs.stb_id=stb_inv.stb_id " 
     "LEFT JOIN result_options AS SCRIPT " 
     "ON results_stbs.script_result=SCRIPT.result_option_id " 
     "LEFT JOIN result_options AS POST " 
     "ON results_stbs.post_result=POST.result_option_id " 
     "JOIN results_tests " 
     "ON results_stbs.results_test_id=results_tests.results_test_id " 
     "JOIN builds " 
     "ON builds.build_id=results_stbs.build_id " 
     "JOIN stb_hw_info_ids " 
     "ON stb_hw_info_ids.stb_hw_info_ids_id=results_stbs.stb_hw_info_ids_id " 
     "JOIN stb_hw_info " 
     "ON stb_hw_info.stb_hw_info_id=stb_hw_info_ids.stb_hw_info_id " 
     "LEFT JOIN defects_tests " 
     "ON results_tests.results_test_id=defects_tests.results_test_id " 
     "LEFT JOIN defects " 
     "ON defects.defect_id=defects_tests.defect_id " 
     "WHERE tr_test_cases.tr_id = '%s' AND script_result IN (1, 3, 8) " 
     "OR tr_test_cases.tr_id = '%s' AND post_result IN (1, 3, 8) " 
     "ORDER BY results_stb_id ASC ") % (s, s) 

     cursor.execute(query) 
     rows = cursor.fetchall() 
     return rows 


    def tr_info(self): 
     tr_id = self.kwargs['trID'] 
     tr_info = TrDetails.objects.get(
      tr_id=tr_id, 
     ) 
     return tr_info 

對不起,這個問題可能太簡單了。但是,我是Django框架的新手。當用戶點擊上面的鏈接時,我想傳遞get_queryset()函數的返回值來導出csv文件。任何幫助將不勝感激。

+1

爲什麼使用巨大的sql查詢?你知道Django使用ORM嗎? –

+0

嗨@SancaKembang。感謝那。是的,我知道ORM。但是這個查詢是特定的,所以查詢需要以這種方式編寫。我的問題是,如何在用戶點擊鏈接時導出csv文件? – pydev

回答

1

我認爲你可以處理它裏面的def get(self, request, *args, **kwargs)否則函數,然後創建一個特定視圖渲染content_type = 'text/csv',因爲在使用HTML模板您ExportCsv(ListView)

欲瞭解更多信息,可以在下面回答這些問題;

我給你一個例子,如何做到這一點。

import csv 
from django.http import HttpResponse 
# and others imported modules... 


def export_csv_file(request, queryset): 
    response = HttpResponse(content_type='text/csv') 
    response['Content-Disposition'] = 'attachment;filename=export.csv' 

    # opts = queryset.model._meta 
    # field_names = [field.name for field in opts.fields] 

    writer = csv.writer(response) 
    # write a first row with header information 
    # writer.writerow(field_names) 

    # write data rows 
    # I suggest you to check what output of `queryset` 
    # because your `queryset` using `cursor.fetchall()` 
    # print(queryset) 
    for row in queryset: 
     writer.writerow(row) 
    return response 


class ExportCsvListView(ListView): 
    template_name = 'testing/tr_export_csv.html' 
    context_object_name = 'export_csv' 

    def get_queryset(self): 
     qtr_id = self.kwargs['trID'] 
     s = str(qtr_id) 
     cursor = connections['default'].cursor() 

     query =(".....") % (s, s) 

     cursor.execute(query) 
     rows = cursor.fetchall() 
     return rows 

    def get(self, request, *args, **kwargs): 
     self.format = request.GET.get('format', False) 

     # my/url/?format=csv 
     if self.format == 'csv': 
      return export_csv_file(request, self.get_queryset()) 

     return super(ExportCsvListView, self).get(request, *args, **kwargs) 


    def get_context_data(self, **kwargs): 
     context = super(ExportCsvListView, self).get_context_data(**kwargs) 
     context['tr_info'] = self.tr_info() 
     return context 
+0

非常感謝@Sanca Kembang的幫助。我真的很感激;)csv文件將被導出到哪裏?當我運行這個代碼時,我沒有得到任何導出的文件。 – pydev

+0

這對於'ExportCsvListView'網址,例如:'Export CSV'.. –

+0

非常感謝你。你是一個超級明星;)我真的很感謝你的幫助。 – pydev