如何在Django中为(基于类)通用对象列表创建过滤器表单?

cvk*_*cvk 12 django

我正在使用Django 1.3基于类的通用视图来显示图像列表,但我想添加一个过滤器,使用户能够缩小显示的结果范围.

我当前的方法有效,但感觉相当hackish:

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
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法将自定义过滤添加到通用视图?

rew*_*ten 20

我使用相同的方法,但通用,使用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
Run Code Online (Sandbox Code Playgroud)

这允许指定接受的过滤器列表,并且它们不需要与实际.filter()关键字对应.然后,您可以将其展开以支持更复杂的过滤(在执行__in__range过滤时,用逗号分隔是一个简单的示例)