Не удается добиться обновления двух элементов при использовании Django и HTMX
Я пытаюсь создать автомобильный пул, где я использую HTMX в моем проекте Django, чтобы заставить его работать. Модель CarPool состоит из двух FK. Один FK - это "City", а другой - "Car". У меня это в некоторой степени работает. Таким образом, внутри двух таблиц (одна таблица со всеми автомобилями, не имеющими привязки к городу, а другая таблица отображает все автомобили, привязанные к городу, на который был сделан клик) я могу использовать hx-post для добавления автомобиля, и то же самое для удаления автомобиля с выбранным городом. Но я не могу заставить списки обновляться после нажатия на них.
Я пробовал разные способы использования hx-oob-swap, но поскольку я довольно новичок в работе с Django и HTMX, я не уверен, где именно его использовать.
См. прилагаемые изображения. Итак, картинка "notclicked", левая таблица показывает все автомобили без города, а правая таблица показывает автомобили с "Chicago" в качестве FK. notclicked
Картинка "нажата" Сейчас я нажал на автомобиль MMW 331 из левой таблицы, и он добавляет его в правую таблицу, что хорошо, но затем, когда я нажимаю на него, я хочу, чтобы он также был удален из левой таблицы (то же самое происходит, если я удаляю автомобиль из правой таблицы) нажал
Благодарю за любую помощь :)
Вот моя тестовая репозиция с github: github
Лично я не понимаю, почему вы не можете просто сделать обычный запрос и обновить всю страницу.
Использование htmx может показаться довольно сложным, и есть несколько способов справиться с этим. Хотя я предпочитаю избегать использования oob и предпочитаю подход с использованием пользовательских заголовков tirgger:
Создайте 2 конечные точки:
- удаление элемента из левой таблицы (POST)
- получение данных из правой таблицы (GET)
Следуйте примеру htmx delete row, чтобы увидеть, как должно происходить удаление.
Чтобы вторая таблица обновлялась после удаления элемента, вы можете прикрепить htmx trigger header к ответу на удаление.
Для этого необходимо установить пакет django-htmx (который будет вам полезен в целом при работе с django + htmx).
Подробнее о пользовательских заголовках ответа htmx можно прочитать здесь.
Так что ваш ответ будет выглядеть примерно так:
return trigger_client_event(
HttpResponse(''),
"citySelected",
after="swap"
)
Это заставит htmx запустить событие citySelected
, после того как будет возвращен ответ на удаление элемента.
Затем вы можете использовать это событие для обновления содержимого правой части таблицы (или ее tbody
) следующим образом:
<tbody id="filter-cars" hx-get="/list-of-cars/" hx-trigger="citySelected from:body">
Это решение может быть весьма спорным, но это один из способов его реализации.
Разобрался с этим благодаря комментарию. Итак, в моих представлениях добавления/удаления автомобиля вместо возврата шаблона я вернул trigger_client_event
:
Добавить автомобиль:
def car_pool_add(request, pk, city_id):
'''Add a car with no cities to a city that is clicked'''
city = get_object_or_404(City, pk=city_id)
car = get_object_or_404(CarPool, pk=pk)
if request.htmx:
car.city = city
car.save()
return trigger_client_event(
HttpResponse(''),
"citySelected",
after="swap")
Снять машину:
def car_pool_remove(request, pk):
'''Remove a car from a city'''
car = get_object_or_404(CarPool, pk=pk)
if request.htmx:
car.city = None
car.save()
return trigger_client_event(
HttpResponse(''),
"citySelected",
after="swap")
После этого в шаблоне "car_pool_cars.html" я просто добавил в строку следующее:
<div class="row"
hx-trigger="citySelected from:body"
hx-get="{% url 'htmx_tests:car_pool_cars' city.pk %}">
Не нажата:
Нажата: