Python 3.x 如何在两个不同的视图中使用相同的django过滤器类(filters.py)
我在下面定义了一个过滤器类。 过滤器.pyPython 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
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})