Django: объединение поискового представления с нумерацией страниц - PullRequest
0 голосов
/ 21 февраля 2019

В Django CBV (ListView) после отправки формы методом GET с полями filter_1 и filter_2 полученный URL-адрес выглядит примерно так:

http://example.com/order/advanced-search?filter_1=foo&filter_2=bar

Все хорошо.Тем не менее, я хотел бы использовать нумерацию страниц, доказывая для моего шаблона URL-адрес, например:

http://example.com/order/advanced-search?page=2&filter_1=foo&filter_2=bar

Допустим, я мог бы переопределить этот метод для этой цели:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['my_form_values'] = self.request.GET

Теперь, как я могу использовать my_form_values в моем шаблоне нумерации страниц для отображения правильных URL-адресов?

А сейчас, вот мой (упрощенный) код шаблона нумерации страниц:

{% for num in page_obj.page_range %}
    {% if page_obj.number == num %}
        <li class="page-item active">
            <span class="page-link">{{ num }}</span>
        </li>
    {% else %}
        <li class="page-item">
            <a class="page-link" href="?page={{ num }}">{{ num }}</a>
        </li>
    {% endif %}
{% endfor %}

1 Ответ

0 голосов
/ 21 февраля 2019

Я делаю это так

@register.simple_tag(takes_context=True)
def param_replace(context, **kwargs):
    d =context['request'].GET.copy()
    for k,v in kwargs.items():
        d[k] = v
    for k in [k for k,v in d.items() if not v]:
        del d[k]
    return d.urlencode()

и затем нумерация страниц в шаблоне

<ul class="pagination">
    {% if page_obj.has_previous %}
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=1 %}">{% trans 'first' %}</a>
        </li>
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=page_obj.previous_page_number %}">{{ page_obj.previous_page_number }}</a>
        </li>
    {% endif %}
    <li class="page-item active"><a class="page-link"
                                    href="?{{ page_obj.number }}">{{ page_obj.number }}</a>
    </li>
    {% if page_obj.has_next %}
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=page_obj.next_page_number %}">{{ page_obj.next_page_number }}</a>
        </li>
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=page_obj.paginator.num_pages %}">{% trans 'last' %}</a>
        </li>
    {% endif %}
</ul>
...