2017-02-20 37 views
1

В настоящее время у меня есть приложение django, которое я могу выполнить для поиска моей базы данных, которая заполняет таблицу html из запроса.Загрузите файл text/csv из приложения django, который заполняет таблицу HTML из запроса базы данных

Мой 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> 

мои url:

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 (sample = 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 потеряет свои данные: Страница 1 = поле поиска для лаборатории номер лаборатории> проходит number 'to view ... Page 2 = отображаемая таблица html на основе запроса базы данных с использованием «номера лаборатории» - в нижней части таблицы есть кнопка «загрузить». Page 3 = щелкните по загрузке и экспортирует мою таблицу html на csv, используя другое представление. << Как получить данные «номер лаборатории» со страницы 2> 3, так как данные GET будут потеряны? – trouselife

0

может быть самым быстрым решением будет плагин: jQuery Datatables

И некоторые легкие настройки для ваша страница.

0

Вы можете написать URL route для вашего действия download. Направьте его на download_view вид в urls.py