Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

6.5 Cортировка записей
1 из 1 шага пройден

Теперь добавим возможность сортировать книги.

Добавим функцию сортировки book_list_sort() в файл books\views.py:

@require_http_methods(['GET'])
def book_list_sort(request, filter, direction):
    if filter == "id":
        if direction == 'ascend':
            book_list = Book.objects.order_by('pk')
        else:
            book_list = Book.objects.order_by('-pk')
    else:
        if direction == 'ascend':
            book_list = Book.objects.order_by(filter)
        else:
            book_list = Book.objects.order_by('-' + filter)
    return render(request, 'partial_book_list.html', {'book_list': book_list})


Добавим маршрут для данной функции, отредактируем файл books\urls.py:

from django.urls import path
from .views import book_list, create_book, update_book_details, book_detail, delete_book, update_book_status, \
    book_list_sort

urlpatterns = [
    path("", book_list, name="book_list"),
    path("create_book/", create_book, name="create_book"),
    path("update_book_details/<int:pk>/", update_book_details, name="update_book_details"),
    path("book_detail/<int:pk>/", book_detail, name="book_detail"),
    path("delete_book/<int:pk>/", delete_book, name="delete_book"),
    path("update_book_status/<int:pk>/", update_book_status, name="update_book_status"),
    path("book_list_sort/<filter>/<direction>/", book_list_sort, name="book_list_sort"),
]


Теперь подключим стрелочки сортировки в заголовке таблицы, в файле шаблона templates\base.html:

                    <thead>
                    <tr>
                        <!-- Заголовки столбцов таблицы -->

                        <!-- Заголовок номера книги -->
                        <th scope="col" style="width: 10%">
                            <small>
                                No.
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='id' direction='ascend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='id' direction='descend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                            </small>
                        </th>

                        <!-- Заголовок названия книги -->
                        <th scope="col" style="width: 26%">
                            <small>
                                Title
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='title' direction='ascend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='title' direction='descend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                            </small>
                        </th>

                        <!-- Заголовок автора книги -->
                        <th scope="col" style="width: 26%">
                            <small>
                                Author
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='author' direction='ascend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='author' direction='descend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                            </small>
                        </th>

                        <!-- Заголовок цены книги -->
                        <th scope="col" style="width: 11%">
                            <small>
                                Price ($)
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='price' direction='ascend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='price' direction='descend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                            </small>
                        </th>

                        <!-- Заголовок статуса книги -->
                        <th scope="col" style="width: 11%">
                            <small>
                                Status
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='read' direction='descend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                                <a href=""
                                   hx-get="{% url 'book_list_sort' filter='read' direction='ascend' %}"
                                   hx-target="#book-list"
                                   hx-swap="innerHTML"></a>
                            </small>
                        </th>

                    </tr>
                    </thead>

 
HTMX атрибуты для кнопок сортировки  и :

  • hx-get="{% url 'book_list_sort' filter='id' direction='ascend' %} определяет адрес запроса
    /book_list_sort/id/ascend/ и тип запроса - GET, сортировка по-возрастанию.
  • hx-get="{% url 'book_list_sort' filter='id' direction='descend' %} определяет адрес запроса
    /book_list_sort/id/descend/ и тип запроса - GET, сортировка по-убыванию.

Ответ AJAX запроса будет добавлен в целевой элемент <tbody id="book-list">, с заменой дочерних элементов.
То есть будут заменены все строки в теле таблицы, на отсортированные строки.

Попробуем отсортировать наши записи по названию книги:


Как мы видим, сортировка прекрасно работает, без необходимости каждый раз обновлять страницу:


Вот такими простыми методами мы добавили сортировку в наш проект, последним же этапом будет привести наш проект к красивому внешнему виду.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Скрины не грузятся...

@Михаил_Тевелев, В обоих курсах нет изображений загруженных на сторонние ресурсы, все изображения загружены исключительно на степик. Если они не работают, то вероятно на каком-то из серверов степика ведутся работы. У меня было так две недели назад, пол дня изображения не загружались, потом само исправилось.

Еще бы фильтр на Ajax или js fetch был бы в этом курсе...

@Илья_Бальва, я думаю сделаем)

Подскажите, пожалуйста, с использованием пагинации такая сортировка сохранится на следующих страницах? Я имею ввиду отсортированный список сохраниться?

@Владимир_Бунин, сохранится конечно, на вход функции пагинатора идёт уже отсортированный список.