【问题标题】:How to pass a filter from a dropdown into django-import-export view如何将过滤器从下拉列表传递到 django-import-export 视图
【发布时间】:2021-07-05 00:02:21
【问题描述】:

我了解如何通过具有return render(request, 'htmlname.html, {}) 的视图传递过滤器。 对于通过 django-import-export 导出选项导出数据的这种情况,我不知道该怎么做。我想从下拉选择中传递一个过滤器来下载要下载的数据。 我的看法

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

【问题讨论】:

    标签: python django django-views dropdown django-import-export


    【解决方案1】:

    您可以采取几种方法。您选择的方法可能取决于这是“一次性”还是您需要可重用的类。我可能会赞成“方法 2”。

    方法一

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

    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)
    

    方法二

    覆盖资源上的get_queryset() 方法。您可以在实例化时设置 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)
    

    如果您查看 export() 的源代码,应该会更清楚地知道发生了什么,以及它们是如何结合在一起的。

    【讨论】:

    • 这是一个可重用的类,过滤器应该来自表单的下拉选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多