Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在两个不同的视图中使用相同的django过滤器类(filters.py)_Python 3.x_Django_Django Models_Django Rest Framework_Django Views - Fatal编程技术网

Python 3.x 如何在两个不同的视图中使用相同的django过滤器类(filters.py)

Python 3.x 如何在两个不同的视图中使用相同的django过滤器类(filters.py),python-3.x,django,django-models,django-rest-framework,django-views,Python 3.x,Django,Django Models,Django Rest Framework,Django Views,我在下面定义了一个过滤器类。 过滤器.py class CTAFilter(django_filters.FilterSet): id = django_filters.NumberFilter(label="DSID") class Meta: model = CTA fields = ['id', 'EmailID','id','Shift_timing'] 现在我想在普通模板(表数据)视图和下载视图中使用这个CTAFil

我在下面定义了一个过滤器类。 过滤器.py

class CTAFilter(django_filters.FilterSet):
    id = django_filters.NumberFilter(label="DSID")
    class Meta:
        model = CTA
        fields = ['id', 'EmailID','id','Shift_timing']
现在我想在普通模板(表数据)视图和下载视图中使用这个CTAFilter

我已经观察到,它在正常渲染视图中运行良好,但当我在下载视图中使用它时,它不起作用,并且我正在获取.xls文件中的所有模型数据

请查找我发布的以下问题。

我无法解决此问题。我已尝试检查是否可以全局定义此问题,以便过滤器可以用于所有视图(如RESTAPI)

是否有任何方法可以使我的下载视图成为普通渲染视图的子视图类,以便使用父视图中的以下代码(因为它工作正常)

cta_list=cta.objects.all() cta_filter=ctaflter(request.GET,queryset=cta_list)allcta=cta_filter.qs

A> 过滤器正常工作的正常视图

b> 下载视图,我试图使用相同的过滤器,但它给我所有的记录


我不太明白为什么要为下载创建单独的视图,如果它们使用相同的过滤器,那么最终应该呈现与普通视图相同的数据。也许这只是我的误解,所以我不确定这是否对你有帮助,但让我们看看

首先让我解释一下背景。这是一个任务管理应用程序,在那里我有一个html页面,登录的人可以查看他们完成的所有任务。不过,用户可能有来自许多不同项目的任务,因此我创建了一个下拉列表,允许他们按单个项目进行筛选。他们可能还希望只查看特定的任务周期,因此我允许他们通过提供开始和结束日期来设置日期范围。(这里没有令人吃惊或惊天动地的内容。)一旦设置了参数,用户单击搜索按钮,就会显示过滤后的结果。该页面还有一个导出按钮,用于将过滤列表的结果下载到.xls电子表格中

那我该怎么做呢?首先,我使用Django-Tables2来呈现我的表。我在tables.py中简单地预定义了表,并从视图中向它抛出我想要的数据,它会处理所有事情。因此,我的视图代码是最小的,非常简单,如下所示

from django_tables2.export.export import TableExport
from .tables import CompletedTable

     def completedlist(request, page='0', name=''):
            #Check to see if we have clicked a button inside the form
            if request.method == 'POST':
                return redirect ('tasks:tasklist')
            else:
                # Pre-filtering of user and Master = True etc is done in the MasterListFilter in filters.py
                # Then we compile the list for Filtering by. 
                f = CompletedListFilter(request.GET, queryset=Task.objects.all(),request=request)
                # Then we apply the complete list to the table, configure it and then render it.
                completedtable = CompletedTable(f.qs)
                rows = len(completedtable.rows)
                if int(page) > 0:
                    RequestConfig(request, paginate={'page': page, 'per_page': 10}).configure(completedtable)
                else:
                    RequestConfig(request, paginate={'page': 1, 'per_page': 10}).configure(completedtable)
                export_format = request.GET.get('_export', None)  
                if TableExport.is_valid_format(export_format):
                    exporter = TableExport(export_format, completedtable)
                    return exporter.response('Completed Tasks.{}'.format(export_format))
                return render (request,'tasks/completedlist.html',{'completedtable': completedtable, 'filter': f, 'rows': rows})
如您所见,每次用户点击搜索或导出按钮时,我都会使用以下行重新编译变量f中的queryset:

f = CompletedListFilter(request.GET, queryset=Task.objects.all(),request=request)
我已使用以下代码在html页面中预定义了.xls格式:

<button class="btn btn-primary btn-xs" name="_export" value="xls" type="submit">Export</button>
如果用户未单击“导出”按钮,则“导出格式”将默认为“无”。如果他们这样做了,它将是html中定义的.xls。然后,我只需按照用户设置的过滤器导出数据,或者使用相同的过滤数据列表呈现页面,如下所示:

export_format = request.GET.get('_export', None)
if TableExport.is_valid_format(export_format):
      exporter = TableExport(export_format, completedtable)
      return exporter.response('Completed Tasks.{}'.format(export_format))
return render (request,'tasks/completedlist.html',{'completedtable': completedtable, 'filter': f, 'rows': rows})
 
好了。正如你所说,你的过滤器是为正常的看法,我没有详细说明我的过滤器,因为这似乎是不必要的


也许这个解决方案对于您的需求来说过于简单,是的,在我被其他开发人员否决之前,有一些限制,例如“如果用户想要使用.xls以外的东西怎么办?”或者“如果他们想要一次导出多个项目怎么办?”诸如此类,总有改进的余地,但当我遇到问题时,我经常会发现把事情剥离到最基本的方面,看看能从中得到什么帮助。

嗨,schilling,没有问题,如果我使用两个单独的视图,那么我就不会在下载视图中得到filter queryset(获取所有记录)。当它在第一个视图中工作时,我正在渲染表数据。谢谢@Cander!它帮助我实现基于过滤器的下载。谢谢你的帮助。
export_format = request.GET.get('_export', None)
if TableExport.is_valid_format(export_format):
      exporter = TableExport(export_format, completedtable)
      return exporter.response('Completed Tasks.{}'.format(export_format))
return render (request,'tasks/completedlist.html',{'completedtable': completedtable, 'filter': f, 'rows': rows})