Как передать фильтр из выпадающего списка в представление django-импорт-экспорт

#python #django #django-views #dropdown #django-import-export

Вопрос:

Я понимаю, как пропускать фильтр через представления, которые имеют 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')
 

Ответ №1:

Есть несколько подходов, которые вы могли бы предпринять. Выбранный вами подход может зависеть от того, является ли это «одноразовым» или вам нужен повторно используемый класс. Я бы, вероятно, предпочел «метод 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() , это должно прояснить, что происходит и как это сочетается.

Комментарии:

1. Это класс многократного использования, и фильтр должен быть выбран из выпадающего списка формы.