从 Django 导出过滤后的数据 table
Exporting the filtered data from a django table
我正在使用 django-filter 和 django-import-export。我可以构建一个 HTML table 并使用 django-filter 过滤它就好了,但我希望用户能够导出过滤后的 table,而不是整个 table . (也就是说,这不是通过管理功能。)
我 怀疑 问题是我对列表本身有一个视图,但导出在另一个视图中,我似乎无法将过滤后的查询集传递给导出视图,我不知道如何在同一视图上进行导出和过滤。它们都是 GET 请求。我觉得我在这里遗漏了一些非常非常基本的东西。
在我的 app/views.py:
from django.http import HttpResponse
from django.shortcuts import render
from .filters import RoleFilter
from .models import Role
from .resources import RoleResource
from tablib import Dataset
def role_list(request):
"""list the roles and filter appropriately"""
f = RoleFilter(request.GET, queryset=Role.objects.all())
return render(request, 'app/rolelist.html', {'filter': f})
def export_filtered_roles(request):
"""export to csv"""
f = RoleFilter(request.GET, queryset=Role.objects.all())
dataset = RoleResource.export(f)
response = HttpResponse(dataset.csv, content_type="text/csv")
response['Content-Disposition'] = 'attachment;filename="roles.csv"'
return response
我似乎无法建立联系。这个版本的代码给我一个错误:RoleFilter 对象没有属性 'before-export'。如果我使用 dataset = RoleResource.export(f.qs)
.
我会得到同样的错误
关于如何将过滤器绑定到导出视图有什么建议吗?
附加信息:这是我正在使用的模板
<form method="get" action=".">
{{ filter.form.as_p }}
<input type="submit" value="Filter"/>
</form>
<table>... loops through filter.qs ...</table>
<a href="{% url 'roleexport' %}">Export Roles</a>
这就是我认为 Form 对象和导出功能之间存在脱节的原因。我可以通过某种方式控制表单的导出吗?
我认为这行看起来不正确:
dataset = RoleResource.export(f)
您正在 class 上调用 export()
,而不是 class 的实例。
如果你尝试会发生什么:
dataset = RoleResource().export(f.qs)
正如您所说,export()
将查询集作为参数,而不是过滤器,因此请确保您传递的是来自过滤器的 qs,而不是过滤器本身。
这似乎是一种 hack,但它确实有效。我所要做的就是更改模板中的 link:
<a href="{% url 'roleexport' %}?{{request.GET.urlencode}}">Export Roles</a>
这适用于已过滤和未过滤的列表。
我正在使用 django-filter 和 django-import-export。我可以构建一个 HTML table 并使用 django-filter 过滤它就好了,但我希望用户能够导出过滤后的 table,而不是整个 table . (也就是说,这不是通过管理功能。)
我 怀疑 问题是我对列表本身有一个视图,但导出在另一个视图中,我似乎无法将过滤后的查询集传递给导出视图,我不知道如何在同一视图上进行导出和过滤。它们都是 GET 请求。我觉得我在这里遗漏了一些非常非常基本的东西。
在我的 app/views.py:
from django.http import HttpResponse
from django.shortcuts import render
from .filters import RoleFilter
from .models import Role
from .resources import RoleResource
from tablib import Dataset
def role_list(request):
"""list the roles and filter appropriately"""
f = RoleFilter(request.GET, queryset=Role.objects.all())
return render(request, 'app/rolelist.html', {'filter': f})
def export_filtered_roles(request):
"""export to csv"""
f = RoleFilter(request.GET, queryset=Role.objects.all())
dataset = RoleResource.export(f)
response = HttpResponse(dataset.csv, content_type="text/csv")
response['Content-Disposition'] = 'attachment;filename="roles.csv"'
return response
我似乎无法建立联系。这个版本的代码给我一个错误:RoleFilter 对象没有属性 'before-export'。如果我使用 dataset = RoleResource.export(f.qs)
.
关于如何将过滤器绑定到导出视图有什么建议吗?
附加信息:这是我正在使用的模板
<form method="get" action=".">
{{ filter.form.as_p }}
<input type="submit" value="Filter"/>
</form>
<table>... loops through filter.qs ...</table>
<a href="{% url 'roleexport' %}">Export Roles</a>
这就是我认为 Form 对象和导出功能之间存在脱节的原因。我可以通过某种方式控制表单的导出吗?
我认为这行看起来不正确:
dataset = RoleResource.export(f)
您正在 class 上调用 export()
,而不是 class 的实例。
如果你尝试会发生什么:
dataset = RoleResource().export(f.qs)
正如您所说,export()
将查询集作为参数,而不是过滤器,因此请确保您传递的是来自过滤器的 qs,而不是过滤器本身。
这似乎是一种 hack,但它确实有效。我所要做的就是更改模板中的 link:
<a href="{% url 'roleexport' %}?{{request.GET.urlencode}}">Export Roles</a>
这适用于已过滤和未过滤的列表。