#python #django #csv
#python #django #csv
Вопрос:
Итак, сценарий таков: у меня есть форма поиска, в которой пользователь вводит или выбирает критерии. Эти критерии публикуются, и я получаю возвращаемый запрос, отфильтрованный по этим критериям. Код для формы поиска похож на приведенный ниже код.
Что я хочу сделать сейчас, так это взять эти результаты и экспортировать их в csv
файл. Итак, как я уже сказал, у меня есть почти тот же код, в котором я получаю свои параметры / критерии с помощью GET . В основном я ПОЛУЧАЮ критерии, которые пользователь ввел или выбрал после создания поисковой записи.
До сих пор я успешно получил параметры, я вижу их в печатном виде, и экспорт отключен, но я вижу только первую строку. Похоже, я не могу передать запрос (как указано в результатах).
Вот мой код:
def get_csv(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=mycsv.csv'
if request.method == 'GET':
params = {}
your_values = {}
context = {}
field_1 = request.GET.get('field_1',None)
field_2 = request.GET.get('field_2',None)
field_3 = request.GET.get('field_3',None)
if field_1:
your_values['field_1'] = field_1
if field_2:
your_values['field_2'] = field_2
if field_3:
your_values['field_3'] = field_3
if field_4:
your_values['field_4'] = field_4
for key, value in your_values.items():
if value:
params[key] = value
print('params are:',params)
results = Model.objects.filter(**params)
writer = csv.writer(response)
writer.writerow([h for h in [
'Header_1',
'Header_2',
'Header_3',
'Header_4',
]])
#I tried that as well:writer.writerows([r for r in[results]])
for field in results:
field_list = [
field.filed_1,
field.field_2,
field.field_3,
field.field_4,
]
for i, item in enumerate(field_list):
if item:
field_list[i] = item
writer.writerow(field_list)
return response
Ответ №1:
Вы видите только одну строку, потому что вы передаете только одну строку:
for field in results:
field_list = [
field.filed_1,
field.field_2,
field.field_3,
field.field_4,
]
В приведенном выше примере вводится только элемент из последней итерации, field_list
а предыдущие результаты отбрасываются.
Вместо этого вы можете использовать понимание списка для создания списка списков, добавляя индексы одновременно с использованием enumerate
. А затем одновременно записывает все строки, используя writerows
:
results = Model.objects.filter(**params)
writer = csv.writer(response)
writer.writerow(['Header_1', 'Header_2', 'Header_3', 'Header_4'])
field_list = [[i, f.field_1, f.field_2, f.field_3, f.field_4]
for i, f in enumerate(results) if f]
writer.writerows(field_list)
# ^ notice the s
Комментарии:
1. Нет, не сработало: (я все еще вижу только первую строку, которую я передаю
2. Вы используете
writerows
с множественным числом s или исправляете это своим исходным кодом?3. Что вы имеете в виду? Попробуйте распечатать
results
, чтобы подтвердить это.4. print(результаты) возвращает [ ] print(csv_params), хотя возвращает параметры
5. Спасибо за ваши временные нравы, ваш ответ был «самым правильным». Проблема в том, что параметры не передаются в запросе!!