Пагинатор и 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 ... но я сдаюсь на данный момент ... Спасибо всем за помощь

Вернуться на верх