使用过滤器时如何使用 django_tables2 进行搜索
Posted
技术标签:
【中文标题】使用过滤器时如何使用 django_tables2 进行搜索【英文标题】:How to search with django_tables2 when using filters 【发布时间】:2019-09-22 00:39:40 【问题描述】:我的问题是过滤后我无法取回任何数据。 我的搜索字段是:id name 和 surname。最后两个取自客户端,是外键。
filters.py
class OrderFilter(django_filters.FilterSet):
client__name = django_filters.CharFilter(lookup_expr='icontains')
client__surname = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Order
fields = ['id']
models.py
class Order(models.Model):
client = models.ForeignKey(Client,verbose_name=u'Client')
tables.py
class OrderTable(tables.Table):
#CUSTOM COLUMN EXAMPLE
order_id=tables.Column(verbose_name= 'ID Order',orderable=False,empty_values=())
class Meta:
#define the model
model = Order
exclude=('id')
template_name = 'django_tables2/bootstrap.html'
sequence = ("order_id")
views.py
class OrderListView(SingleTableMixin,FilterView):
table_class = OrderTable
model = Order
template_name='orders/orde_list.html'
filterset_class = OrderFilter
def get_context_data(self, **kwargs):
context = super(OrderListView, self).get_context_data(**kwargs)
##filter the orders of the past 4 months.
last_four_months=date.today() - timedelta(120)
object_list=Order.objects.filter(order_created__gte=last_four_months,ays=1).order_by('-invoice_date')
table=self.table_class(object_list)
RequestConfig(self.request).configure(table)
context['table'] = table
#clear all fields
has_filter = any(field in self.request.GET for field in set(self.filterset_class.get_fields()))
context['has_filter'] = has_filter
return context
我注意到,当我创建一个自定义查询集来填充我的表时,例如:object_list=Order.objects.filter(order_created__gte=last_four_months).order_by('-invoice_date') 过滤不起作用。
当我什么都不放时,它可以正常工作。
知道为什么会这样吗?
【问题讨论】:
【参考方案1】:问题是我没有定义我的自定义查询集必须插入自定义表(tables.py)中,更重要的是要被自定义过滤器(filters.py)过滤。
在这样做之后,自定义查询集正确过滤。
class OrderAYSListView(LoginRequiredMixin,SingleTableMixin,FilterView):
login_url = '/login/'
table_class = OrderTable2
model = Order
template_name='orders/order_ays_list.html'
filterset_class = OrderFilter
def get_context_data(self, **kwargs):
context = super(OrderAYSListView, self).get_context_data(**kwargs)
##filter the orders of the past 4 months.
last_four_months=date.today() - timedelta(120)
object_list=Order.objects.filter(order_created__gte=last_four_months,ays=1).order_by('-invoice_date')
f = self.filterset_class(self.request.GET, queryset=object_list)
context['filter'] = f
table = self.table_class(f.qs)
RequestConfig(self.request).configure(table)
context['table'] = table
#clear all fields
has_filter = any(field in self.request.GET for field in set(self.filterset_class.get_fields()))
context['has_filter'] = has_filter
return context
【讨论】:
以上是关于使用过滤器时如何使用 django_tables2 进行搜索的主要内容,如果未能解决你的问题,请参考以下文章
Django-tables2 - 如何在 TemplateColumn 中使用自定义过滤器
使用 Spark Web 框架时如何使用原生 Servlet 过滤器?