Простой пример того, как использовать представление на основе классов и django-фильтр?

#django-views #django-class-based-views #django-filter

#django-views #представления на основе классов django #django-filter

Вопрос:

Пример в документации, https://django-filter.readthedocs.org/en/latest/usage.html , я думаю, для представления, основанного на функциях. В настоящее время я изучаю, как это сделать с представлением на основе классов.

 def product_list(request):
    f = ProductFilter(request.GET, queryset=Product.objects.all())
    return render_to_response('my_app/template.html', {'filter': f})
  

Ответ №1:

Еще немного копания, и мне удалось ответить на него. Я использовал код отсюда https://github.com/rasca/django-enhanced-cbv .

Я добавил содержимое list.py в свое основное приложение как main_app/filter_mixin.py

Затем в приложении, в котором я добавлял поиск в представление списка, я добавил файл filter.py , подобный этому (идентичный документации)

 from django_filters import FilterSet
from .models import Contact


class ContactFilter(FilterSet):
    class Meta:
        model = Contact
        fields = ['name_first', 'name_last']
  

Теперь view.py становится:

 from vanilla import ListView

from .filter import ContactFilter
from galleria.filter_mixin import ListFilteredMixin


class ContactList(ListFilteredMixin, ListView):
    filter_set = ContactFilter
  

Ответ №2:

Вот пример с простой перезаписью набора запросов, чтобы разрешить фильтрацию и контекст для встраивания фильтров в шаблон.

 class ObjFilter(django_filters.FilterSet):
    class Meta:
        model = Obj
        fields = ["field1", "field2"]


class ObjView(ListView):
    template_name = "template.html"
    model = Obj
    paginate_by = 10
    ordering = ["-id"]

    def get_queryset(self):
        queryset = super().get_queryset()
        filter = ObjFilter(self.request.GET, queryset)
        return filter.qs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        queryset = self.get_queryset()
        filter = ObjFilter(self.request.GET, queryset)
        context["filter"] = filter
        return context
  

Ответ №3:

Как упоминалось в ссылке Просмотр подмножеств объектов

Вы можете использовать что-то вроде этого views.py

 class modelListView(someGenericView):
        queryset = modelName.object.filter(myFilter)