Как повторно отображать код шаблона django при вызове AJAX

У меня есть представление, которое отправляет объект с разбивкой на страницы (в наборе запросов) в шаблон, который я далее отображаю в шаблоне в виде таблицы. То, что я пытаюсь сделать, это щелкнуть номер страницы на панели разбиения на страницы в шаблоне, он должен сделать вызов ajax, чтобы получить разбитый на страницы вывод для этого номера страницы и динамически обновить содержимое таблицы.

Вид:

def accounts(request):
    #Including only necessary part
    accounts_list = Accounts.objects.all()
    paginator = Paginator(accounts_list, 25)
    page = request.GET.get('page')
    try:
        accounts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        accounts = paginator.page(1)
    except EmptyPage:
        # If page is out of range, deliver last page of results.
        accounts = paginator.page(paginator.num_pages)

    context['accounts'] = accounts
    return render(request, template, context)

Шаблон загружает это как:

{% if accounts %}
<table id="acc">
    <tr>
        <th>Field 1</th>
        ...
        <th>Field N</th>
    </tr>
    {% for item in accounts %}
    <tr> 
        <td>{{ item.field1 }}</td>
        ...<!-- Some complex logic with template tags too in here -->
        <td>{{ item.fieldN }}</td>
    </tr>
    {% endfor %}
</table>
{% endif %}

Теперь для панели разбивки на страницы я использую библиотеку Bootpag и могу отображать данные как :

$('.pagination_top').bootpag({
   /*bootpag logic here */
}).on("page", function(event, num){
    //$.ajax loading here where I can update the table div with new output 
    //or make the table div "template code" reload without reloading page
}

Извините, я не показал большую часть того, что я пробовал в части ajax, так как я совершенно не понимаю, как заставить шаблон повторно отображать новые учетные записи, возвращаемые без перезагрузки страницы.

Единственное грязное решение, о котором я могу думать, - это сгенерировать весь мой html в представлении, а затем обновить html таблицы div с новым возвращенным html ajax?

Как проще всего было бы перезагрузить div таблицы, используя логику рендеринга шаблона, написанную без перезагрузки страницы? Можно ли этого добиться, сделав табличную часть отдельным шаблоном и включив/расширив шаблоны?

Обратите внимание, что я не могу использовать метод получения всех данных в шаблоне, а затем использовать логику разбивки на страницы некоторых библиотек jquery/js, потому что полные данные относительно очень велики.


person MohitC    schedule 27.09.2016    source источник


Ответы (2)


Я решил проблему следующим образом:

Разделил табличную часть как шаблон table.html как:

приложение/таблица.html:

{% if accounts %}
<table id="acc">
    <tr>
        <th>Field 1</th>
        ...
        <th>Field N</th>
    </tr>
    {% for item in accounts %}
    <tr> 
        <td>{{ item.field1 }}</td>
        ...<!-- Some complex logic with template tags too in here -->
        <td>{{ item.fieldN }}</td>
    </tr>
    {% endfor %}
</table>
{% endif %}

Вызывается это в основном шаблоне main.html как включенный шаблон:

приложение/main.html:

<div class="table-responsive">
    {% include 'app/table.html' %}
</div>

Теперь, на мой взгляд, я добавил строку, которая отображает только table.html, если запрос является запросом ajax.

if request.is_ajax():
        return render(request, 'app/table.html', context)
#else
return render(request, 'app/main.html', context)

Перезагрузка таблицы при нумерации страниц как:

$('.pagination_top').bootpag({
   /*bootpag logic here */
}).on("page", function(event, num){
    $(".table-responsive").html('').load(
        "{% url 'app:accounts' %}?page=" + num
    );
});
person MohitC    schedule 28.09.2016
comment
ваш js-скрипт все еще перезагружает страницу, URL-адрес страницы меняется с каждым кликом? - person sgauri; 28.02.2018
comment
Нет, не перезагружает страницу. - person MohitC; 03.01.2021

Если вы хотите полагаться на шаблоны django, вам следует перезагрузить страницу и отправить информацию о разбивке на страницы в запросах. Это то, что обычно делается (например, в django-admin). Требуется перезагрузка страницы, но для этого и созданы шаблоны django.

В противном случае я бы делегировал весь рендеринг клиенту и предоставлял только представление JSON внутри django. Таким образом, django предоставит шаблон, который включает в себя некоторую разметку вместе с вашей любимой библиотекой js, которая позаботится о вызовах AJAX и отрисовывает данные непосредственно самостоятельно.

ОБНОВЛЕНИЕ:

Если вам действительно нужно это сделать, подход, который вы упомянули, возможен. Ничто не мешает вам отрендерить часть вашего шаблона, передать его на аутсорсинг в отдельный файл и отправить уже отрендеренный HTML вашему клиенту.

Поэтому вы можете использовать тег include template для перемещения таблицы шаблон в отдельный файл. Для вызовов AJAX вы должны использовать второе представление, которое просто отображает табличную часть вашего шаблона.

Все это кажется мне хакерским, но оно должно работать.

person dahrens    schedule 27.09.2016
comment
В этом сценарии нет способа отображать данные, возвращаемые ajax, с тегами шаблонов django? Поскольку моя логика зависит от этих шаблонных тегов - person MohitC; 27.09.2016
comment
Какая необходимость в разделении шаблона, если мне нужно создать весь HTML-код в самом представлении? - person MohitC; 27.09.2016