Я предлагаю создать новую запись в urls.py для ссылки на скачивание CSV и подключить ее к представлению, которое возвращает CSV.
Затем в шаблоне результатов поиска вы можете указать ссылку на этот новый URL-адрес, передавая те же термины поиска, что и параметры GET, которые вы можете использовать в представлении CSV для повторного генерирования результата.
Чтобы уменьшить дублирование, поскольку теперь у вас есть обычное представление html и обработка представления csv, возвращающие одни и те же данные, вы можете создать одно представление с аргументом, который указывает, должен ли он возвращать отображаемый шаблон или результат CSV.
Вы упоминаете, что уже знаете, как это сделать, но в случае, если кто-то еще наткнется на эту страницу, вот как представление может вернуть CSV и заставить браузер загрузить его в виде файла:
def csv_list(request):
""" Renders a csv list """
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=file.csv'
writer = csv.writer(response, dialect=csv.excel)
writer.writerow(['col1', 'col2', 'col3'])
return response