[英]How to pass a filter from a dropdown into django-import-export view
I understand on how to pass a filter through views that have the return render(request, 'htmlname.html, {})
.我了解如何通过具有
return render(request, 'htmlname.html, {})
的视图传递过滤器。 I don't know how to do it for this case of exporting data through django-import-export export option.对于这种通过 django-import-export 导出选项导出数据的情况,我不知道该怎么做。 I'd like to pass a filter from a dropdown selection for the data to be downloaded.
我想从下拉选择中传递一个过滤器来下载要下载的数据。 My view
我的观点
def ExportStudentsView(request):
dataset = ExportStudentsResource().export(school = request.user.school,klass = ?????????)
response = HttpResponse(dataset.xls, content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="All students.xls"'
return response
My resource我的资源
class ExportStudentsResource(resources.ModelResource):
def export(self, queryset = None, *args, **kwargs):#this method helps capture the current user school
queryset = Students.objects.filter(school = kwargs['school'],klass = kwargs['klass'])
return super(ExportStudentsResource, self).export(queryset, *args, **kwargs)
klass__name = fields.Field(attribute = 'klass__name',column_name='class')#Changes column name from school__name to school
stream__name = fields.Field(attribute = 'stream__name',column_name='stream')
gender__name = fields.Field(attribute = 'gender__name',column_name='gender')
class Meta:
model = Students
fields = ('adm','name','kcpe','klass__name','stream__name','gender__name','notes')
export_id_fields = ('adm',)
export_order = ('adm','name','kcpe','klass__name','stream__name','gender__name','notes')
There are a couple of approaches you could take.您可以采取几种方法。 The approach you choose might depend on whether this is a "one-off" or if you need a reusable class.
您选择的方法可能取决于这是“一次性”还是您是否需要可重复使用的 class。 I would probably favour 'method 2'.
我可能会赞成“方法2”。
You could filter the queryset in your view, and then pass this to export:您可以在视图中过滤查询集,然后将其传递给导出:
def export_students(request):
queryset = Students.objects.filter(school = kwargs['school'], klass = kwargs['klass'])
# notice that the first arg to the Resource is a Queryset
dataset = ExportStudentsResource().export(queryset)
Override the get_queryset()
method on your resource.覆盖资源上的
get_queryset()
方法。 You can set args at instantiation and have them apply to the query:您可以在实例化时设置 args 并将它们应用于查询:
class ExportStudentsResource(resources.ModelResource):
def __init__(self, **kwargs):
self.school = kwargs['school']
self.klass = kwargs['klass']
def get_queryset(self):
return Students.objects.filter(school=self.school, klass=self.klass)
If you look at the source for export()
it should make it clearer what is going on, and how this fits together.如果您查看
export()
的源代码,它应该更清楚发生了什么,以及它是如何组合在一起的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.