Как создать форму фильтра для списка универсальных объектов (на основе классов) в Django? - PullRequest
12 голосов
/ 10 августа 2011

Я использую общий вид на основе классов в 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

Есть ли лучшие способы добавить пользовательскую фильтрацию в общее представление?

Ответы [ 2 ]

20 голосов
/ 10 августа 2011

Я использую тот же подход, но общий, используя миксин:

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 или __range)

1 голос
/ 09 сентября 2014

Взгляните на django-filter это простое решение для фильтрации данных в поле зрения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...