我正在使用 Django 1.3 的基于类的通用视图来显示图像列表,但我想添加一个过滤器,使用户能够缩小显示结果的范围。
我目前的方法有效,但感觉很黑客:
class ImageFilterForm(ModelForm):
class Meta:
model = Image
class ImageListView(ListView):
model = Image
def get_queryset(self):
qs = Image.objects.select_related()
for item in self.request.GET:
key, value = item, self.request.GET.getlist(item)
# ... Filtering here ...
return qs
def get_context_data(self, **kwargs):
context = super(ImageListView, self).get_context_data(**kwargs)
context['filter_form'] = ImageFilterForm(self.request.GET)
return context
是否有更好的方法将自定义过滤添加到通用视图?
我使用相同的方法,但通用,使用 mixin:
class FilterMixin(object):
def get_queryset_filters(self):
filters = {}
for item in self.allowed_filters:
if item in self.request.GET:
filters[self.allowed_filters[item]] = self.request.GET[item]
return filters
def get_queryset(self):
return super(FilterMixin, self).get_queryset()\
.filter(**self.get_queryset_filters())
class ImageListView(FilterMixin, ListView):
allowed_filters = {
'name': 'name',
'tag': 'tag__name',
}
# no need to override get_queryset
这允许指定接受的过滤器列表,并且它们不需要对应于实际的.filter()
关键词。然后,您可以扩展它以支持更复杂的过滤(在执行操作时用逗号分隔)__in
or __range
过滤器是一个简单的例子)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)