Фильтры для 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