Как создать пагинатор django с помощью ajax?

Сейчас я пытаюсь создать пагинатор django с помощью ajax. Я только что попробовал простой способ, используя $('#div_id').load() для загрузки списков статей. Но проблема моего кода в том, что пагинатор не обновлялся, а это значит, что если у меня есть пагинатор типа "1,2,3,...,9,10", я могу загружать списки статей только со страницы 1,2, 3,9,10 и я не могу загрузить списки с 4 по 8 потому что в пагинаторе нет номеров страниц. Итак, как я могу решить эту проблему?

Мой код View.py:

class IndexView(ListView):
model = Article
template_name = "articles.html"
context_object_name = "article_list"
paginate_by = 2

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)

    paginator = context.get('paginator')
    page = context.get('page_obj')
    is_paginated = context.get('is_paginated')

    pagination_data = self.pagination_data(paginator, page, is_paginated)
    context.update(pagination_data)

    return context

def pagination_data(self, paginator, page, is_paginated):

    if not is_paginated:
        return {}

    left = []
    right = []

    left_has_more = False
    right_has_more = False

    first = False
    last = False

    page_now = page.number
    page_total = paginator.num_pages
    page_range = paginator.page_range

    if page_now == 1:
        right = page_range[page_now:page_now + 2]

        if right[-1]<page_total - 1:
            right_has_more = True
        if right[-1]<page_total:
            last = True
    elif page_now == page_total:
        left = page_range[(page_now - 3) if (page_now - 3) > 0 else 0:page_now - 1]

        if left[0] > 2:
            left_has_more = True
        if left[0] > 1:
            first = True
    else:
        left = page_range[(page_now - 3) if (page_now - 3) > 0 else 0:page_now - 1]
        right = page_range[page_now:page_now + 2]

        if right[-1] < page_total - 1:
            right_has_more = True
        if right[-1] < page_total:
            last = True

        if left[0]>2:
            left_has_more = True
        if left[0] > 1:
            first = True

    page_data = {
        'left':left,
        'right':right,
        'left_has_more':left_more,
        'right_has_more':right_more,
        'first':first,
        'last':last
    }
    return page_data

и мой html тело:

{% if is_paginated %}
        <div class = "ui pagination menu" id = "p_manu_num">
            {% if first %}
                <a class = "item" name = "1">1</a>
            {% endif %}
            {% if left %}
                {% if left_more %}
                    <div class = "disabled item">...</div>
                {% endif %}
                {% for i in left %}
                    <a class = "item" name = "{{ i }}">{{ i }}</a>
                {% endfor %}
            {% endif %}
            <a class = "item active" id = "act" name = "{{ page_obj.number }}"><b>{{ page_obj.number }}</b></a>
            {% if right %}
                {% for j in right %}
                    <a class = "item" name = "{{ j }}">{{ j }}</a>
                {% endfor %}
                {% if right_more %}
                    <div class = "disabled item">...</div>
                {% endif %}
            {% endif %}
        {% if last %}
            <a class = "item" name = "{{ paginator.num_pages }}">{{ paginator.num_pages }}</a>
        {% endif %}
    </div>
    {% endif %}

мой HTML-скрипты:

    $('#p_manu_num a').on('click', function () {
    var art_url = "?page = " + $(this).attr('name') +" #blog_content_arts"
    $('#blog_content_arts').load(art_url).transition('fade in')
})

Я буду очень признателен, если вы можете мне помочь!

Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
0
2 119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не нужно изобретать велосипед! Django имеет встроенную разбивку на страницы, которая значительно облегчит выполнение того, что вы пытаетесь сделать.

Взгляните на это: https://docs.djangoproject.com/en/2.2/topics/pagination/#using-paginator-in-a-view

Вы можете использовать код в примере для рендеринга response, а затем добавить его в DOM с помощью JS.

Поскольку этот вопрос был просмотрен более 1000 раз, я пришел, чтобы ответить на этот вопрос сам, надеюсь, что эта небольшая демонстрация поможет читателям:

Демонстрационный код выглядит следующим образом:

View.py

def test(request):
    objs = Article.objects.all()
    page = request.GET.get('page', 1)
    paginator = Paginator(objs, 1)    #number means items per page

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

    return render(request, 'test.html', {'sets':sets})

test.html

<div id = "box">
    {% for item in sets %}
        {{ item.Title }}
    {% empty %}
        Nothing.
    {% endfor %}

    {% if sets.has_previous %}
        <button id = "previous_button">Previous</button>
    {% else %}
        <button disabled>Prvious</button>
    {% endif %}
    {% if sets.has_next %}
        <button id = "next_button">Next</button>
    {% else %}
        <button disabled>Next</button>
    {% endif %}
</div>

Скрипт

$('#next_button').on('click', function () {
    {% if sets.has_next %}
        page = {{ sets.next_page_number }};
    {% endif %}
$.ajax({
    type: "GET",
    url: './',
    data: {
        page: page
    },
    success: function (data) {
        $('#box').html(data)
        },
    });
});

$('#previous_button').on('click', function () {
    {% if sets.has_previous %}
        page = {{ sets.previous_page_number }};
    {% endif %}
$.ajax({
    type: "GET",
    url: './',
    data: {
        page: page
    },
    success: function (data) {
        $('#box').html(data)
        },
    });
});

Другие вопросы по теме