Django: передача отфильтрованного Queryset в ListView? - PullRequest
0 голосов
/ 21 января 2019

Используя Django Class Based Views, у меня уже есть ListView для Order объектов, и я создал FormView для выполнения расширенного поиска по этим заказчикам.

Однако я не уверен, как передать отфильтрованный набор запросов FormView в ListView.

Вот код с закомментированными разделами для объяснения проблемы:

class OrdersListView(PermissionRequiredCanHandleOrders,
                     SelectRelatedMixin, PrefetchRelatedMixin,
                     ModelInContextMixin, SubSectionLastOrders,
                     RestaurantOrdersOnly,
                     ListView):
    model = Order
    paginator_class = DiggPaginator
    paginate_by = 15
    select_related = ('convive__user',)
    prefetch_related = ('orderoperation_set',)
    # will use the template named order_list.html


class OrdersAdvancedSearchView(PermissionRequiredCanHandleOrders,
                               ModelInContextMixin, SubSectionLastOrders,
                               RestaurantOrdersOnly, RestaurantMixin,
                               FormView):
    model = Order
    template_name = "orders/order_advanced_search.html"
    form_class = OrderAdvancedSearchForm


    def form_valid(self, form):

        data = form.cleaned_data
        queryset = Order.objects.all()

        # Here, I'm using the form content to filter the queryset
        # queryset = queryset.filter(some_attribute__in=data['stuff'])

        # MY PAIN POINT IS HERE: what I'm supposed to do here ?
        # my queryset is filtered, and I need to call OrderListView 
        # with it.

        return super().form_valid(form)

1 Ответ

0 голосов
/ 21 января 2019

Вы должны использовать ListView для фильтрации набора запросов с параметрами запроса GET. Для этого добавьте форму в свой контекст и обработайте ее при получении набора запросов:

def get_queryset(self):
    self.form = OrderAdvancedSearchForm(data=self.request.GET or None)
    if self.request.GET and form.is_valid():
        # filter using the form's cleaned_data
        queryset = super().get_queryset().filter(...)
    else:
        queryset = super().get_queryset()
    return queryset

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)  # this calls self.get_queryset() which assigns self.form
    context['form'] = self.form
    return context

Теперь в вашем шаблоне вы можете просто отобразить ту же форму, за исключением того, что ее метод должен быть "GET", а не "POST".

...