Джанго Пагинация с Аяксом - PullRequest
       21

Джанго Пагинация с Аяксом

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

Я пытаюсь отобразить таблицу HTML, которая динамически обновляется каждые 3 секунды.С некоторой помощью мне удалось заставить эту часть работать, однако, когда база данных станет больше, потребуется разбиение на страницы.Django-Pagination довольно прост, но у меня возникли проблемы с тем, чтобы заставить его работать с дополнительной сложностью Ajax.Я посмотрел на соответствующие вопросы SO, но они были либо очень старыми, либо у них не было ответов.Код: index.html

{% extends 'app/base.html' %}
{%load staticfiles %}
{% block body_block %}
    <div class="container" >

        {% if elements %}
            <table id="_appendHere" class="table table-bordered">

                <tr>
                    <th>A</th>
                    <th>B</th>
                    <th>C</th>
                    <th>D</th>
                    <th>User</th>
                    <th>Date</th>
                </tr>

                {% for e in elements %}
                    <tr>
                        <td><a href="{{ e.A.url }}">{{e.A}}</a></td>
                        <td><a href="{{ e.B.url }}">{{e.B}}</a></td>
                        <td>{{ e.C }}</td>
                        <td>{{ e.D }}</td>
                        <td>{{ e.User  }}</td>
                        <td>{{ e.Date }}</td>

                    </tr>
                {% endfor %}  
            </table>

        {% else %}
            No data to display! <br/>

        {% endif %}
    </div>
{% endblock %}

<script>

setInterval(function() {
    $.ajax({
        type: "GET",
        url: "get_more_tables/",  // URL to your view that serves new info
    })
    .done(function(response) {
        $('#_appendHere').append(response);

    });
}, 1000)

</script>

views.py

def paginate(input_list, request):
    page = request.GET.get('page', 1)
    paginator = Paginator(input_list, 10)
    elements = paginator.page(page)

    return {'elements': elements}

def index(request):

    elements = ElementFile.objects.all().order_by('-upload_date')
    context_dict = {'elements':elements}

    response = render(request,'app/index.html',context_dict)
    return response

def get_more_tables(request):
    elements = ElementFile.objects.all().order_by('-upload_date')
    context_dict = paginate(elements, request)
    return render(request, 'app/get_more_tables.html', context_dict)

get_more_tables.html

<tbody>
<table>
<tr><...corresponding th blocks omitted...></tr>

{% for e in elements %}
    <tr>
        <td><a href="{{ e.A.url }}">{{e.A}}</a></td>
        <td><a href="{{ e.B.url }}">{{e.B}}</a></td>
        <td>{{ e.C }}</td>
        <td>{{ e.D }}</td>
        <td>{{ e.User  }}</td>
        <td>{{ e.Date }}</td>
    </tr>
{% endfor %}

</tbody>
</table>

            {% if e.has_other_pages %}
                <ul class="pagination">
                    {% if e.has_previous %}
                        <li><a class = "pag" href="?page={{ e.previous_page_number }}">&laquo;</a></li>
                    {% else %}
                        <li class="disabled"><span>&laquo;</span></li>
                    {% endif %}
                    {% for i in e.paginator.page_range %}
                        {% if e.number == i %}
                            <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
                        {% else %}
                            <li><a class = "pag" href="?page={{ i }}">{{ i }}</a></li>
                        {% endif %}
                    {% endfor %}
                    {% if e.has_next %}
                        <li><a class = "pag" href="?page={{ e.next_page_number }}">&raquo;</a></li>
                    {% else %}
                        <li class="disabled"><span>&raquo;</span></li>
                    {% endif %}
                </ul>
            {% endif %}

urls.py

urlpatterns = [
    path('', views.index, name=''),
    path('get_more_tables/', views.get_more_tables, name='get_more_tables'),
        ]

В настоящее время таблица обновляется автоматически и разбита на страницы.Однако, если я нажимаю «Далее» или номер страницы от 2 до 10, он просто перезагружает первую страницу.Я попытался скопировать код paginator в index.html, но это тоже не помогает.Я заметил, что если я попал в get_more_tables? Page = 2, я вижу там правильные данные.Как я мог загрузить разбитые на страницы данные с этим осложнением Ajax?Большое спасибо всем, кто может помочь с этим.Застряли на несколько дней.

...