Как экспортировать csv из результатов поиска в Django
У меня есть форма поиска, использующая django-filters, и я хочу экспортировать .csv с отфильтрованным результатом. В настоящее время это дает мне полную страницу данных, и я не уверен, как объединить эти два вида вместе, чтобы использовать фильтрацию.
models.py
class account(models.Model):
Price = models.DecimalField('price', max_length=20, blank=True, null=True, max_digits=10, decimal_places=2)
User = models.CharField('user', max_length=120, blank=True, null=True,)
Account_Number = models.CharField('account Number', max_length=20, blank=True, null=True,)
Date = models.DateField(default=now)
views.py
def stage(request):
slist = account.objects.all()
search_list = account.objects.all()
search_filter = stageFilter(request.GET, queryset=search_list)
return render(request, 'stage.html', {'slist': slist, 'search': search_filter})
def export_csv(request):
employees = account.objects.all()
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="file.csv"'
writer = csv.writer(response)
writer.writerow (['User', 'Account Number', 'Price', 'Date'])
for employee in employees:
writer.writerow([employee.User,employee.Account_Number,employee.Price, employee.Date])
return response
filters.py
class stageFilter(django_filters.FilterSet):
Date = django_filters.DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}))
class Meta:
model = account
fields = ['User', 'Account_Number', 'Price', 'Date']
urls.py
urlpatterns = [
path('stage/', views.stage, name='stage'),
path('export_csv', views.export_csv, name='exportcsv')
]
Вот решение моей проблемы. Очевидно, мне нужно было включить поиск/поисковый набор в определение export_csv, что я уже пытался сделать, но безуспешно. Недостающей частью кода было добавление request.GET.urlencode() в шаблон, который принимает строку запроса из url и передает результат в .csv
views.py
def export_csv(request):
employees = account.objects.all()
search = stageFilter(request.GET, queryset=employees).qs
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="file.csv"'
writer = csv.writer(response)
writer.writerow (['User', 'Account Number', 'Price', 'Date'])
for e in search.values_list('User', 'Account_Number', 'Price', 'Date'):
writer.writerow(e)
return response
html
<table class="table table-striped table-bordered table-hover">
<thead class="table-dark">
<thead>
<tr>
<th>User</th>
<th>Account Number</th>
<th>Price</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<tr>
{% for item in search.qs%}
<td>{{item.User}}</td>
<td>{{item.Account_Number}}</td>
<td>{{item.Price}}</td>
<td>{{item.Date}}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div><a href="{% url 'exportcsv' %}?{{request.GET.urlencode}}">
<button type="button" class="button">Export to CSV</button></a></div>