如何从 Django 的搜索结果中导出 csv

How to export a csv from a search result in 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')
]

这是我的问题的解决方法。我显然需要将 search/queryset 合并到 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>