wagtail框架的wagtail_hooks.py文件中,不使用list_filter过滤器,怎么自定义一个过滤器显示出来?
时间: 2024-02-03 08:14:41 浏览: 21
如果你不想使用`list_filter`过滤器,在`wagtail_hooks.py`文件中自定义一个过滤器可以使用`register_filter`装饰器。
以下是一个简单的例子,展示了如何创建一个名为`CustomStatusFilter`的自定义过滤器:
```python
from django.utils.translation import ugettext_lazy as _
from wagtail.contrib.modeladmin.options import (
ModelAdmin, ModelAdminGroup, register_filter
)
from .models import MyModel
class CustomStatusFilter:
parameter_name = 'status'
def __init__(self, request):
self.request = request
def queryset(self, modeladmin, queryset, value):
if value == 'published':
return queryset.filter(status='published')
elif value == 'draft':
return queryset.filter(status='draft')
return queryset
def choices(self, changelist):
yield {
'selected': self.value() is None,
'query_string': changelist.get_query_string(remove=[self.parameter_name]),
'display': _('All'),
}
yield {
'selected': self.value() == 'published',
'query_string': changelist.get_query_string({self.parameter_name: 'published'}),
'display': _('Published'),
}
yield {
'selected': self.value() == 'draft',
'query_string': changelist.get_query_string({self.parameter_name: 'draft'}),
'display': _('Draft'),
}
class MyModelAdmin(ModelAdmin):
model = MyModel
menu_label = 'My Model'
menu_icon = 'placeholder'
list_display = ('title', 'status')
ordering = ('-id',)
def get_filters(self, request):
filters = super().get_filters(request)
filters.insert(0, CustomStatusFilter(request))
return filters
class MyModelAdminGroup(ModelAdminGroup):
menu_label = 'My Models'
menu_icon = 'folder-open-1'
items = (MyModelAdmin,)
# Register the custom status filter
register_filter(CustomStatusFilter)
# Register the ModelAdminGroup
modeladmin_register(MyModelAdminGroup)
```
在上面的代码中,我们首先定义了一个名为`CustomStatusFilter`的类,该类实现了`queryset`和`choices`方法。`queryset`方法用于过滤出符合条件的数据,而`choices`方法用于在过滤器中显示选项。
然后,我们在`MyModelAdmin`中重写了`get_filters`方法,并将`CustomStatusFilter`添加到过滤器列表的开头。
最后,我们使用`register_filter`装饰器将`CustomStatusFilter`注册到Wagtail中。
这样,你就可以在Wagtail的ModelAdmin页面中使用`CustomStatusFilter`过滤器了。