Django - Ссылка для загрузки CSV в шаблоне - PullRequest
0 голосов
/ 16 ноября 2018

Попытка выяснить, как правильно создать ссылку на скачивание CSV-файла в моем шаблоне.

Views.py

#this is the view that shows the html page (all queries work)
def admin_view(request, mysite):
    context = dict()
    context["mysite"] = mysite.upper()
    group = whid.lower() + "-group"
    user = request.user.get_username()
    authorized = is_authorized(user, group)
    end_time = timezone.now()
    start_time = end_time.replace(day=1, hour=00, minute=00, second=00)
    error_message = ("You are not authorized to be in this page.")
    context['data'] = CheckIn.objects.filter(Date__range=(start_time, end_time))
    today = datetime.datetime.now()
    context['today'] = today
    context['first_day'] = today.replace(day=1, hour=00, minute=1)

    #Calling the csv function here
    context['response'] = export_search_csv(start_time, end_time) 

    if (authorized):
        return render(request, 'mykiosk/admin.html', context)
    else:
        return HttpResponse(error)


#function to grab and create csv
def export_search_csv(start_time, end_time):
    data = CheckIn.objects.filter(Date__range=(start_time, end_time))
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="export.csv"'
    writer = csv.writer(response)
    writer.writerow(['id', 'EmpID', 'BarID', 'Username', 'Type', 'Liability', 'Date'])
    for item in data:
        writer.writerow([item.id, item.EmpID, item.BarID, item.Username, item.Type, item.Liability, item.Date])
    return response

Шаблон

<a href="{{ response}}">export to csv</a>

Тогда все, что я получаю, это <HttpResponse status_code=200, "text/csv"> при попытке получить доступ к ссылке.Я что-то упустил, я просто не уверен, что.В соответствии с внутренними правилами компании, я также не могу использовать библиотеку djqscsv.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 16 ноября 2018

Я думаю, вы делаете это неправильно. Вместо того, чтобы отправлять его через контекст, вы должны преобразовать свой метод export_search_csv в представление и использовать его из шаблона. Например:

def export_search_csv(request, start_date, end_date):
    data = CheckIn.objects.filter(Date__range=(datetime.strptime(start_date, "%Y-%m-%d %H:%M:%S"), datetime.strptime(end_date, "%Y-%m-%d %H:%M:%S")))
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="export.csv"'
    writer = csv.writer(response)
    writer.writerow(['id', 'EmpID', 'BarID', 'Username', 'Type', 'Liability', 'Date'])
    for item in data:
        writer.writerow([item.id, item.EmpID, item.BarID, item.Username, item.Type, item.Liability, item.Date])
    return response


def admin_view(request, mysite):
    ...
    context['start_date'] = startdate.strftime("%Y-%m-%d %H:%M:%S")
    context['end_date'] = enddate.strftime("%Y-%m-%d %H:%M:%S")
    ...

В шаблоне:

<a href="{% url 'export_search_csv' start_date end_date %}">export to csv</a>

Добавить новый URL для нового просмотра:

path('your_path/<str:start_date>/<str:end_date>/', export_search_csv, name='export_search_csv'),
...