Django Пагинация, где пользователь выбирает / Типы желаемой страницы - PullRequest
2 голосов
/ 06 января 2020

Я хочу создать нумерацию страниц, как в любом из следующих примеров:

https://www.martindale.com/search/attorneys/?term=Bankruptcy%20near%20New%20York%2C%20USA (вверху справа от результатов поиска)

https://www.adidas.com/us/superstar?start=0 (прокрутите вниз)

Где пользователь может либо набрать нужную страницу на go и нажать клавишу ввода, либо выбрать раскрывающийся список, показывая все возможные страницы для выбора, а затем после выбора автоматически go на эту страницу (возможно, лучше раскрывающийся список, чтобы пользователи не могли вводить произвольный набор символов в поле ввода). В противном случае поле ввода, в котором пользователь вводит данные, нуждается в проверке forms.py.

При попытке сделать это я столкнулся с проблемой невозможности использования тега шаблона внутри forms.py. Мне удалось сделать шаблон для выпадающего меню l oop, которое перебирает все возможные номера страниц. Но это для l oop не использует forms.py, который я не считаю желательным (потому что нет проверки). Мой код разбиения на страницы в настоящее время отделен от forms.py или тега формы HTML.

Я все еще хотел бы сохранить текущие следующие, предыдущие, первые и последние ссылки, чтобы успокоить этих типов пользователей. Но если страниц результатов много, я хочу дать пользователям свободу быстро go на желаемой странице, которую они хотят, не нажимая следующую или предыдущую кучу раз, чтобы попасть туда.

Как бы получить желаемый результат, похожий на обе ссылки выше?

Текущий HTML Нумерация страниц:

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?{% url_replace paginator.first_page_number %}{{ page_obj.page_number }}1">&laquo; first</a>
            <a href="?{% url_replace paginator.previous_page_number %}{{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
        </span>

        {% if page_obj.has_next %}
            <a href="?{% url_replace paginator.next_page_number %}{{ page_obj.next_page_number }}">next</a>
            <a href="?{% url_replace paginator.last_page_number %}{{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

App_tags.py:

from urllib.parse import urlencode
from django import template

register = template.Library()

@register.simple_tag(takes_context=True)
def url_replace(context, next_page):
    query = context['request'].GET.copy().urlencode()

    if '&page=' in query:
        url = query.rpartition('&page=')[0] # equivalent to .split('page='), except more efficient 
    elif 'page=' in query:
        url = query.rpartition('page=')[0]
    else:
        url = query
    return f'{url}&page={next_page}'

Шаблон попытки для L oop Отображение всех возможных страниц:

<select class="form-control col-md-1" autocomplete="off">
{% for i in "x"|rjust:page_obj.paginator.num_pages %}
<option> {{ forloop.counter }} </option>
{% endfor %}
</select>

Попытка Forms.py:

class CourseForm(forms.Form):

        page_number = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control col-md-1', 'autocomplete':'off', 'id':'title_contains', 'type':'search', 'placeholder': {{ page_obj.number }} }), required=False)

def __init__(self, *args, **kwargs):
        super(CourseForm, self).__init__(*args, **kwargs)
        self.fields['page_number'].widget.attrs['placeholder'] = {{ page_obj.number }}
...