Последним шагом добавим возможность устанавливать статус книги - прочитана она или нет.
Добавим функцию изменения статуса книги update_book_status() в файл books\views.py:
@require_http_methods(['PUT'])
def update_book_status(request, pk):
book = get_object_or_404(Book, pk=pk)
if book.read:
book.read = False
else:
book.read = True
book.save()
return render(request, 'partial_book_detail.html', {'book': book})
Данная функция при вызове меняет статус книги на противоположный.
Добавим маршрут для данной функции, отредактируем файл 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,
)
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"),
]
Подключим кнопки статуса книги Read и Unread в файле шаблона templates\partial_book_detail.html:
<!-- Ячейка состояния -->
<td>
{% if not book.read %}
<!-- Кнопка "Unread" -->
<button class="disbtn"
hx-put="{% url 'update_book_status' book.id %}"
hx-target="closest tr"
hx-swap="outerHTML" >
Unread
</button>
{% else %}
<!-- Кнопка "Read" -->
<button class="disbtn"
hx-put="{% url 'update_book_status' book.id %}"
hx-target="closest tr"
hx-swap="outerHTML" >
Read
</button>
{% endif %}
</td>
HTMX атрибуты для кнопок Read и Unread:
hx-put="{% url 'update_book_status' book.id %}"определяет адрес запроса/update_book_status/<id книги>/и тип запроса - PUT.
После нажатия данной кнопки будет изменён статус текущей книги на противоположный:
И соответственно строка книги в таблице будет заменена на ответ - строку с изменённым статусом-кнопкой: