如何将过滤器从下拉列表传递到django导入导出视图



我了解如何通过具有return render(request, 'htmlname.html, {})的视图传递过滤器。我不知道如何通过django导入导出导出选项导出数据。我想从下拉列表中为要下载的数据传递一个筛选器。我的视图

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

我的资源

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')

您可以采取以下几种方法。你选择的方法可能取决于这是否是一个";一次性的";或者如果你需要一个可重用的类。我可能更喜欢"方法2"。

方法1

您可以在视图中过滤查询集,然后将其传递给导出:

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)

方法2

重写资源上的get_queryset()方法。您可以在实例化时设置参数,并将其应用于查询:

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)

如果你查看export()的来源,它应该会让你更清楚发生了什么,以及这是如何结合在一起的。

最新更新