Выбор пользователем количества объектов на странице в Django

Я сделал пагинацию для своего сайта, но я хочу позволить пользователю выбирать, сколько записей отображается одновременно, например, 10, 15, 25. Это мой views.py

def finished_ads_view(request):
    queryset = Campaign.objects.filter(completion_percent=100)

    try:
        per_page = request.GET['dropdown']
    except:
        per_page = 1

    page = request.GET.get('page', 1)
    paginator = Paginator(queryset, per_page)

    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    context = {
        'posts': posts,
    }

    return render(request, 'finished_campaigns.html', context)

А это часть моего шаблона:

<select name="dropdown">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="15">15</option>
    <option value="20">20</option>
</select>
<input type="submit" value="Submit"/>

Проблема в том, что значение выпадающего списка не меняется, а количество записей, отображаемых за один раз, остается таким же, как и значение except: per_page.

Вам следует обернуть select и submit в форму, чтобы значение передавалось бэкенду в строке запроса.

<form method="get">
    <input type="hidden" name="page" value="{{ page }}">
    ...
</form>

Также необходимо включить параметр пагинации, поэтому я добавил его. Вам также необходимо добавить его в контекст. Затем при создании ссылок для страниц с атрибутом GET не забудьте передать dropdown также

Чтобы увидеть весь шаблон, может быть лучше. Я могу только представить:

<form>
<-- any staff here -->
    <input type="hidden" name="page" value="{{ request.GET.page }}">
<-- any staff here -->
<select name="dropdown">
    <option {% if request.GET.dropdown == "1" %}selected{% endif %} 
 value="1">1</option>
    <option {% if request.GET.dropdown == "2" %}selected{% endif %} 
 value="2">2</option>
    <option {% if request.GET.dropdown == "15" %}selected{% endif %} value="15">15</option>
    <option {% if request.GET.dropdown == "20" %}selected{% endif %} value="20">20</option>
</select>
<-- any staff here -->
<input type="submit" />
<-- any staff here -->
</form>

Не забудьте добавить запрос в контексте, если у вас нет request context processor.

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