Django Фильтр, запрос seacrh и разбиение на страницы - PullRequest
0 голосов
/ 14 января 2020

У меня проблема с использованием фильтров и разбивки на страницы, я пробовал так много примеров, которые я видел здесь, о переполнении стека, но, похоже, ничего не работает. Я использую CBV (ListView). Фильтр работает, но есть проблема с разбиением на страницы, когда я нажимаю «Далее» или на странице 2 фильтр разрывается. Я хочу, чтобы страница была разбита на страницы и отображала оставшиеся фильтрованные элементы на следующей странице.

template. html

{% if is_paginated %}

            {% if page_obj.has_previous %}
                <a class="btn btn-info mb-4" href="?{% if object_list %}q={{ object_list }}&{% endif %}page={{ page_obj.previous_page_number }}">&laquo; Previous</a>
            {% endif %}

            {% for num in page_obj.paginator.page_range %}
                {% if page_obj.number == num %}
                    <a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
                {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
                    <a class="btn btn-info mb-4" href="?{% if object_list %}q={{ filter }}&{% endif %}page={{ num }}">{{ num }}</a>
                {% endif %}
            {% endfor %}


             {% if page_obj.has_next %}
                <a class="btn btn-info mb-4" href="?{% if object_list %}q={{ object_list }}&{% endif %}page={{ page_obj.next_page_number }}">Next</a>
                <a class="btn btn-info mb-4" href="?{% if object_list %}q={{ object_list }}&{% endif %}page={{ page_obj.paginator.num_pages }}">Last &laquo;</a>
             {% endif %}

        {% endif %}

Затем я использовал Django -фильтры, но фильтры не работают , Как лучше всего добиться того, что я ищу.

models.py

class Job(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)

filters.py

class SearchFilter(django_filters.FilterSet):
title = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Job
        fields = ('title',)

views.py

class SearchView(FilterView):
model = Job
template_name = 'search.html'
filterset_class = SearchFilter
ordering = ['-date']
paginate_by = 3
context_object_name = 'jobs'
strict = False

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['filter'] = SearchFilter(self.request.GET, queryset=self.get_queryset())
    return context

1 Ответ

1 голос
/ 15 января 2020

Добавьте это в свои get_context_data:

query = self.request.GET.copy()
if 'page' in query:
    del query['page']
context['queries'] = query

и вот полная нумерация страниц списка:

{% if is_paginated %}
    {% if page_obj.has_previous %}
        <li>
            <a href="?{{ queries.urlencode }}&amp;page=1"><i class="fa fa-angle-double-left"></i></a>
        </li>
        <li>
            <a href="?{{ queries.urlencode }}&amp;page={{ page_obj.previous_page_number }}"><i class="fa fa-angle-left"></i></a>
        </li>
    {% else %}
        <li>
            <a href="#"><i class="fa fa-angle-double-left"></i></a>
        </li>
        <li>
            <a href="#"><i class="fa fa-angle-left"></i></a>
        </li>
    {% endif %}

    {% for i in page_obj.paginator.page_range %}
        {% if page_obj.number == i %}
            <li>
                <a href="#">{{ i }}</a>
            </li>
        {% elif i > page_obj.number|add:'-4' and i < page_obj.number|add:'4' %}
            <li>
                <a href="?{{ queries.urlencode }}&amp;page={{ i }}">{{ i }}</a>
            </li>
        {% endif %}
    {% endfor %}

    {% if page_obj.has_next %}
        <li>
            <a href="?{{ queries.urlencode }}&amp;page={{ page_obj.next_page_number }}"><i class="fa fa-angle-right"></i></a>
        </li>
        <li>
            <a href="?{{ queries.urlencode }}&amp;page={{ page_obj.paginator.num_pages }}"><i class="fa fa-angle-double-right"></i></a>
        </li>
    {% else %}
        <li>
            <a href="#"><i class="fa fa-angle-right"></i></a>
        </li>
        <li>
            <a href="#"><i class="fa fa-angle-double-right"></i></a>
        </li>
    {% endif %}
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...