Как добавить пагинатор и фильтр на свой сайт?
Я делаю проект, в котором мне нужно отображать автомобили, и пользователь может фильтровать свои запросы на основе цены, марки, модели и т.д. Ранее сегодня фильтр не работал, а пагинатор работал, но теперь фильтр работает, а пагинатор нет. Я застрял на этом весь день и не знаю, что еще делать.
Вот мой код:
views.py
def posts(request):
cars = Userpost.objects.all()
myFilter = UserpostFilter(request.GET, queryset=cars)
cars = myFilter.qs
p = Paginator(Userpost.objects.all(), 2)
page = request.GET.get('page')
cars_list = p.get_page(page)
nums = "a" * cars_list.paginator.num_pages
context = {'cars':cars, "myFilter":myFilter, 'cars_list':cars_list, "nums":nums}
return render(request, 'store/userposts.html', context)
userposts.html
{% extends 'store/main.html' %}
{% load static %}
{% block content %}
<div class = 'row'>
<div class = 'col'>
<div class = 'card card-body'>
<form method="get">
{{myFilter.form}}
<button class="btn btn-primary" type = "submit">Search</button>
</form>
</div>
</div>
</div>
<div class="row">
{% for car in cars %}
<div class="col-lg-4">
<img class="thumbnail" src="{{car.imageURL|default:'/images/transparentLogo.png'}}">
<div class="box-element product">
<h6><strong>{{car.Year}} {{car.Make}} {{car.Model}}</strong></h6>
<hr>
<a class="btn btn-outline-success" href="{% url 'post_detail' car.pk %}">View</a>
<h4 style="display: inline-block; float: right"><strong>${{car.Price|floatformat:2}}</strong></h4>
</div>
</div>
{% endfor %}
</div>
<nav aria-label="Page navigation"> <ul class="pagination">
{% if cars_list.has_previous %}
<li class="page-item">
<a class="page-link" href="?page=1" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">begin</span>
</a>
</li> {% endif %}
{% for n in cars_list.paginator.page_range %}
{% if cars_list.number == n %}
<li class="page-item active">
<span class="page-link">{{ n }}<span class="sr-only">(current)</span></span>
</li>
{% elif n > cars_list.number|add:'-3' and n < cars_list.number|add:'3' %}
<li class="page-item"><a class="page-link" href="?page={{ n }}">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if cars_list.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ cars_list.paginator.num_pages }}" aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">end</span>
</a>
</li>
{% endif %} </ul> </nav>
<br/>
{% endblock content %}
filters.py
class UserpostFilter(django_filters.FilterSet):
start_date = DateFilter(field_name = "date_published", lookup_expr = 'gte')
end_date = DateFilter(field_name = "date_published", lookup_expr = 'lte')
min_price = django_filters.NumberFilter(field_name="Price", lookup_expr='gte')
max_price = django_filters.NumberFilter(field_name="Price", lookup_expr='lte')
class Meta:
model = Userpost
field = '__all__'
exclude = 'image', 'user', 'Price', 'Email', 'date_published'
Я заметил, что когда я изменяю цикл for в userposts.html на "for car in cars_list", пагинация работает, но ломает фильтр, а при использовании "for car in cars" фильтр работает, но ломается пагинация.
Я не знаю, что с этим делать, и буду очень признателен за помощь
попробуйте это
def posts(request):
cars = Userpost.objects.all()
myFilter = UserpostFilter(request.GET, queryset=cars)
if myFilter.qs:
cars = myFilter.qs
paginator = Paginator(cars, 2)
page = request.GET.get('page')
try:
cars = paginator.page(page)
except PageNotAnInteger:
cars = paginator.page(1)
except EmptyPage:
cars = paginator.page(paginator.num_pages)
context = {'cars_list':cars, "myFilter":myFilter}
return render(request, 'store/userposts.html', context)
шаблон
{% extends 'store/main.html' %}
{% load static %}
{% block content %}
<div class = 'row'>
<div class = 'col'>
<div class = 'card card-body'>
<form method="get">
{{myFilter.form}}
<button class="btn btn-primary" type = "submit">Search</button>
</form>
</div>
</div>
</div>
<div class="row">
{% for car in cars_list %}
<div class="col-lg-4">
<img class="thumbnail" src="{{car.imageURL|default:'/images/transparentLogo.png'}}">
<div class="box-element product">
<h6><strong>{{car.Year}} {{car.Make}} {{car.Model}}</strong></h6>
<hr>
<a class="btn btn-outline-success" href="{% url 'post_detail' car.pk %}">View</a>
<h4 style="display: inline-block; float: right"><strong>${{car.Price|floatformat:2}}</strong></h4>
</div>
</div>
{% endfor %}
</div>
<nav aria-label="Page navigation"> <ul class="pagination">
{% if cars_list.has_previous %}
<li class="page-item">
<a class="page-link" href="?page=1" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">begin</span>
</a>
</li> {% endif %}
{% for n in cars_list.paginator.page_range %}
{% if cars_list.number == n %}
<li class="page-item active">
<span class="page-link">{{ n }}<span class="sr-only">(current)</span></span>
</li>
{% elif n > cars_list.number|add:'-3' and n < cars_list.number|add:'3' %}
<li class="page-item"><a class="page-link" href="?page={{ n }}">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if cars_list.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ cars_list.paginator.num_pages }}" aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">end</span>
</a>
</li>
{% endif %} </ul> </nav>
<br/>
{% endblock content %}