2017-02-20 81 views
1

我現在有一個Django應用程序,我可以搜索查詢我的數據庫,從查詢填充一個HTML表格填入HTML表格。下載從Django應用程序文本/ CSV文件,從數據庫查詢

我app_home.html看起來是這樣的:

{% load staticfiles %} 
<!DOCTYPE html> 
<html> 
<head> 
    <title>RESULTS APP</title> 
</head> 
    <form method="get" action="results/"> 
     <div class="SearchBar"><input type="text" name="lab_number"></div> 
     <input class='input_button' type='submit'> 
    </form> 

<body></body> 
</html> 

這是我的views.py:

def from_samrun(request):  
    if request.GET: 
     lab_query = request.GET['lab_number'] 
     var_list = VarSamRun.objects.filter(sample=lab_query) 
     if var_list: 
      return render(request, 'results/varlist.html', {'var_list': var_list}) 
     else: 
      return render(request, 'results/varlist.html', {'query': [sam_query]}) 
    else: 
     return render(request, 'results/varlist.html' {'error': 'Error'}) 

它帶我到我的varlist.html模板:

{% load staticfiles %} 
<!DOCTYPE html> 
<html> 
<head><title>Results page</title></head> 

<body> 
    <div> 

     {% if var_list %} 

       {% for v in var_list %} 

       <tr> 
       <td class='varsrow' width='100'>{{v.sample}}</td> 
       <td class='varsrow' width='100'>{{v.gene}}</td> 
       <td class='varsrow' width='200'>{{v.variant}}</td> 
       <td class='varsrow' width='150'>{{v.cds}}</td> 
       <td class='varsrow' width='150'>{{v.protein}}</td> 
       <td class='varsrow' width='200'>{{v.consequence}}</td> 
       <td class='varsrow' width='200'>{{v.run}}</td> 

       <td class='varsrow' width='300'>{{v.annotation}}</td> 
       </tr> 

      {% endfor %}  

     {% elif query %} 

       <h5>Search using: " 

       {% for q in query %} 
        {{q}} 
       {% endfor %} 

      " did not return any results</h5> 

     {% else %} 

      <h5>{{annotation}}</h5> 

    {% endif %} 

    </table> 
    </div> 
    </body> 
</html> 

我的網址是:

urlpatterns = [ 
    url(r'^results/$', views.results_app, name='results_app'), 
    url(r'results/varlist/$', views.from_samrun, name='from_samrun'), 

我想有我varlist.html頁面上的下載按鈕,以便顯示錶時,用戶可以選擇下載 - 導出爲CSV文件。我知道如何將數據寫入到CSV和使用另一種看法下載:

def download_view(request): 
    response = HttpResponse('') 
    response['Content-Disposition'] = 'attachment; filename=file.csv' 
    writer = csv.writer(response, dialect=csv.excel) 
    writer.writerow(some_random_data_list) 
    return response 

,並添加一個表單按鈕下載到我的varlist.html頁:

<form action ='download' method='POST'> 
    {% csrf_token %} 
    <input type='hidden'> 
    <input type='submit' value='Download'> 
</form> 

但我沒有想法如何將信息從我的第一個視圖傳遞到我的下載視圖,或將html表信息作爲對象傳遞給我的下載視圖。 (我試着將{{var_list}}作爲一個值傳遞給這個html表單,從中提取數據並創建一個新的查詢對象,但是這並不適用於每個表格,因爲它們太大了。

有沒有?辦法從第一視圖點擊下載查看我怎麼能去這樣做把我的var_list對象

感謝

+1

你可以把lab_query在varlist.html表單的隱藏字段,並運行VarSamRun.objects.filter(在下載查看樣品= lab_query)再次 –

回答

2

事實上,您正在從您的網站請求相同的一組數據。唯一改變的是格式。所以通常你只是想用GET參數來請求相同的頁面,如?format=csv。所以,你的觀點功能是這樣的:

def from_samrun(request):  
    if request.GET: 
     lab_query = request.GET['lab_number'] 
     var_list = VarSamRun.objects.filter(sample=lab_query) 
     if request.GET['format'] == 'csv': 
      response = HttpResponse('') 
      response['Content-Disposition'] = 'attachment; filename=file.csv' 
      writer = csv.writer(response, dialect=csv.excel) 
      writer.writerow(some_random_data_list) 
      return response 

     if var_list: 
      return render(request, 'results/varlist.html', {'var_list': var_list,'lab_query':lab_query}) 
     else: 
      return render(request, 'results/varlist.html', {'query': [sam_query]}) 
    else: 
     return render(request, 'results/varlist.html' {'error': 'Error'}) 

而且你的模板:

<form method='GET'> 
    <input type='hidden' name='format' value='csv'> 
    <input type='hidden' name='lab_query' value={{lab_query}}> 
    <input type='submit'> 
</form> 
+0

我曾想過這樣做的 - 但是這將意味着我有我的查詢頁面上的下載按鈕,不是嗎?所以在用戶看到它會產生的表之前,他們會下載它?我想用戶看到的表,然後單擊下載按鈕,在該頁面(其中VarSamRun對象數據已經呈現)的底部 – trouselife

+1

可以在模板檢查,如果var_list設置'{%如果var_list%}

...
{%endif%}' – Nerade

+0

但是「request.GET ['lab_number']」不會返回頁面上的任何內容,因爲GET表單會丟失數據:Page 1 ='實驗室號碼'搜索框>通過'實驗室數字'來查看...頁面2 =基於數據庫查詢使用'實驗室號'呈現的html表格 - 表格底部有一個「下載」按鈕... Page 3 =點擊下載並導出我的html表格以csv使用不同的觀點。 <<如何從第2頁獲取'實驗室編號'數據> 3,GET數據將會丟失? – trouselife

0

也許最快的解決方案將插件: jQuery Datatables

而且一些簡單的設置爲你的頁面。

0

您可以爲download行動寫URL route。指向download_view查看在urls.py