Пагинатор и POST-запрос для SearchForm
У меня проблема с Paginator в Django, я пробовал несколько решений, но ни одно не работает так, как я хочу...
Виды
def order_list(request)
form = SearchOrderForm()
if 'search-order-post' in request.session:
form = SearchOrderForm(request.session['search-order-post'])
is_cookie_set = 1
if request.method == 'POST':
form = SearchOrderForm(request.POST)
request.session['search-order-post'] = request.POST
is_cookie_set = 1
if is_cookie_set == 1:
if form.is_valid():
statut = form.cleaned_data['statut']
clients = form.cleaned_data['clients']
[...]
paginator = Paginator(orders, 50)
page = request.GET.get('page')
try:
orders_page = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
orders_page = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
orders_page = paginator.page(paginator.num_pages)
context = {'clients': clients,
'orders': orders_page,
'orders_list': orders,
'paginate': True,
'form': form,
}
return render(request, 'order/list.html', context)
Когда я использую Paginator в GET, чтобы перейти на страницу 2, например... Я потерял все свои запросы :( Есть ли другой способ? form.is_valid() возвращает False когда я меняю страницу
Если вы перейдете на использование GET, вам нужно будет иметь возможность генерировать ссылки пагинации с данными формы и правильным номером страницы. Вы можете использовать QueryDict.urlencode() для генерации строки запроса из данных GET, если вы сначала выведете номер текущей страницы, то сможете указать его вручную
def order_list(request):
...
get_data = request.GET.copy()
page = get_data.pop('page', None)
...
context = {
...,
'query_string': get_data.urlencode(),
}
return render(request, 'order/list.html', context)
Шаблон
<a href="?{{ query_string }}&page={{ page_obj.next_page_number }}">next</a>
Решение с помощью GET запроса :
ШАБЛОН
{% if paginate %}
<div class="clearfix"></div>
<nav aria-label="...">
<ul class="pagination justify-content-center">
{% if orders.has_previous %}
{% if query_string %}
<li class="page-item"><a class="page-link" href="?{{ query_string }}&page={{ orders.previous_page_number }}{{ getvars }}"><<</a></li>
{% else %}
<li class="page-item"><a class="page-link" href="?page={{ orders.previous_page_number }}{{ getvars }}"><<</a></li>
{% endif %}
{% else %}
<li class="page-item disabled"><a class="page-link" href="#"><<</a></li>
{% endif %}
{% if orders.number|add:'-4' > 1 %}
{% if query_string %}
<li class="page-item"><a class="page-link" href="?{{ query_string }}&page={{ orders.number|add:'-5' }}{{ getvars }}">...</a></li>
{% else %}
<li class="page-item"><a class="page-link" href="?page={{ orders.number|add:'-5' }}{{ getvars }}">...</a></li>
{% endif %}
{% endif %}
{% for i in orders.paginator.page_range %}
{% if orders.number == i %}
<li class="page-item active"><span class="page-link" href="#">{{ i }}</span></li>
{% elif i > orders.number|add:'-5' and i < orders.number|add:'10' %}
{% if query_string %}
<li class="page-item"><a class="page-link" href="?{{ query_string }}&page={{ i }}{{ getvars }}">{{ i }}</a></li>
{% else %}
<li class="page-item"><a class="page-link" href="?page={{ i }}{{ getvars }}">{{ i }}</a></li>
{% endif %}
{% endif %}
{% endfor %}
<!-- <span class="current">{{ commandes.number }} / {{ commandes.paginator.num_pages }}</span>-->
{% if orders.has_next %}
{% if query_string %}
<li class="page-item"><a class="page-link" href="?{{ query_string }}&page={{ orders.next_page_number }}{{ getvars }}">>></a></li>
{% else %}
<li class="page-item"><a class="page-link" href="?page={{ orders.next_page_number }}{{ getvars }}">>></a></li>
{% endif %}
{% endif %}
{% else %}
<li class="page-item disabled"><a class="page-link" href="#">>></a></li>
{% endif %}
</ul>
</nav>
{% endif %}
ПРОСМОТРОВ
paginator = Paginator(orders, 50)
get_data = request.GET.copy()
page = request.GET.get('page')
try:
orders_page = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
orders_page = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
orders_page = paginator.page(paginator.num_pages)
context = {'orders': orders_page,
'paginate': True,
'form': form,
'formAction': formAction,
'query_string': get_data.urlencode(),
}
return render(request, 'order/list.html', context)
Возможно, есть лучший способ ... но на самом деле это работает ;) Я знаю, что это возможно с POST и сессией или cookie ... но я сдаюсь на данный момент ... Спасибо всем за помощь