Фильтры для CBV ListView, использующие GET с предыдущей и текущей страницы

Я пытаюсь добавить функцию поиска в ListView в двух местах в моем Django-приложении. На главной странице я хочу, чтобы пользователи могли фильтровать по почтовому индексу, а в шаблоне ListView я также хочу, чтобы пользователи имели возможность фильтровать по другому атрибуту в модели. Моя проблема в том, что self.request.GET.get('q') возвращает None при фильтрации на странице ListView, а я хочу, чтобы он сохранял фильтр по почтовому индексу, который я использовал на предыдущей странице

Для функциональности поиска я использую Q.

<

views.py

class ListingsView(ListView):
    
    model = Listing
    template_name = 'listings/list.html'
    context_object_name = 'listing_list'
    
    def get_queryset(self):
        query_zip = self.request.GET.get('q_zip_code')
        query_category = self.request.GET.get('q_category')
        if query_category == None:
            queryset = Listing.objects.filter(Q(zip_code__icontains = query_zip))
        else:
            queryset = Listing.objects.filter(Q(zip_code__icontains = query_zip) & Q(category__icontains = query_category))
        return queryset

home.html

<p>
     <form class="form-homepage-search" action="{% url 'rental_listings_list' %}" method="get">
          <input name="q_zip_code" class="form-zip" type="text" placeholder="Zip Code" aria-label="Zip Code">
          <button class="button" type="submit">SEARCH</button>
     </form>
</p> 

list.html

<form class="form-listing-search" action="{% url 'rental_listings_list' %}" method="get">
     <input name="q_category" class="form-category" type="text" placeholder="Category" aria-label="Category">
     <button class="button" type="submit">UPDATE</button>
</form>

Добавьте свои list.html:

action="{% url 'rental_listings_list' %}?q_category={{ request.GET.q_category }}"

Наконец-то разобрался с помощью Максима!

Добавить в list.html

<input name="q_zip_code" type="hidden" value="{{ request.GET.q_zip_code }}">

Добавить в view.py

    def get_queryset(self):
        query_zip = self.request.GET.get('q_zip_code')
        query_category = self.request.GET.get('q_category')
        if query_category == None:
            queryset = RentalListing.objects.filter(Q(zip_code__icontains = query_zip))
        else:
            query_zip = self.request.GET.get('q_zip_code', '')
            queryset = RentalListing.objects.filter(Q(zip_code__icontains = query_zip) & Q(category__icontains = query_category))
        return queryset
Вернуться на верх