HTMX не может найти элемент на сайте
Я пытаюсь создать веб-приложение с помощью django и htmx. Одна из функциональных возможностей htmx заключается в том, что я хочу динамически вставлять строки в таблицу. Для этого у меня есть...
файл base.html:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Bootstrap 5-->
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<script src="{% static 'js/bootstrap.min.js' %}" defer></script>
<!-- HTMX -->
<script src="{% static 'js/htmx.min.js' %}" defer></script>
<!-- Favicon -->
<link rel="shortcut icon" type="image/svg" href="{% static 'favicon.svg' %}"/>
<title>Document</title>
</head>
<body hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>
{% include 'navbar.html' %}
<div class="container-fluid">
{% if messages %}
{% for message in messages %}
<div class="alert alert-warning alert-dismissible fade show" role="alert">
<strong>Holy guacamole! {{ message }}</strong>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
{% endif %}
{% block content %}
{% endblock %}
</div>
</body>
</html>
файл "add-periods.html":
и некоторые частицы. Я показываю здесь только партиклы, относящиеся к периоду nursinghome, но остальные точно такие же, за исключением имен переменных: nursinghome-tbody.html:
{% for nursinghome_period in patient.nursinghome_periods.all %}
{% include 'partials/nursinghome-period.html' %}
{% endfor %}
{% include 'partials/nursinghomeform.html' %}
nursinghome-period.html:
{% if not nursinghome_period.start_date and not nursinghome_period.end_date %}
<tr class="d-flex">
<td class="col-8" colspan="2">Dauerhafter Heimaufenthalt</td>
<td class="col-2"></td>
<td class="col-2">
<button class="btn btn-sm btn-danger"
hx-get="{% url 'del-nursinghome-period' nursinghome_period.id %}"
hx-target="closest tr"
>
Löschen
</button>
</td>
</tr>
{% else %}
<tr class="d-flex">
<td class="col-4">{{ nursinghome_period.start_date|date:"d.m.Y" }}</td>
<td class="col-4">{{ nursinghome_period.end_date|date:"d.m.Y" }}</td>
<td class="col-2"></td>
<td class="col-2">
<button class="btn btn-sm btn-danger"
hx-get="{% url 'del-nursinghome-period' nursinghome_period.id %}"
hx-target="closest tr"
>
Löschen
</button>
</td>
</tr>
{% endif %}
и nursinghomeform.html:
{% load widget_tweaks %}
<tr class="table-light d-flex">
<form
hx-post="{% url 'add-nursinghome-period' patient.id %}"
hx-target="closest tbody"
hx-ext="debug"
>
<div class="container">
<td class="col col-4">{% render_field nursinghomeform.start_date type='date' id='start-date' class+='form-control' %}</td>
<td class="col col-4">{% render_field nursinghomeform.end_date type='date' id='end-date' class+='form-control' %}</td>
<td class="col col-2 d-flex align-items-center justify-content-center">
<button class="btn btn-sm btn-success" type="submit">
Zeitraum hinzufügen
</button>
</td>
<td class="col col-2 d-flex align-items-center justify-content-center">
<button type="button" class="btn btn-sm btn-warning"
hx-target="closest tr"
hx-swap="outerHTML"
hx-get="{% url 'add-nursinghome-period' patient.id %}"
>
Abbrechen
</button>
</td>
</div>
</tr>
</form>
и вот соответствующее представление django:
def add_nursinghome_period(request, patient_id):
patient = Patient.objects.get(id=patient_id)
if request.method == "POST":
form = NursingHomeForm(request.POST or None)
if form.is_valid():
nursinghome_period = form.save(commit=False)
nursinghome_period.patient = patient
nursinghome_period.save()
nursinghomeform = NursingHomeForm()
context = {"patient": patient, "nursinghomeform": nursinghomeform}
return render(request, "partials/nursinghome-tbody.html", context)
context = {"nursinghomeform": NursingHomeForm, "patient": patient}
return render(request, "partials/nursinghomeform.html", context)
Ожидаемое поведение:
- При отображении сайта в таблице отображаются все уже введенные периоды nursinghome (работает)
- Когда я нажимаю на кнопку удаления любого из них, период удаляется из базы данных, а строка удаляется из таблицы через htmx (работает)
- Когда я ввожу числа в форму внизу таблицы и ошибаюсь, нажатие на кнопку отмены удаляет эту форму и заменяет ее новой через htmx (не работает)
- При отправке формы период сохраняется в базе данных и вставляется новый tbody, содержащий все периоды, форму и прочее (не работает)
Что я пробовал:
Я использовал браузерные devtools. Я вижу в chrome и firefox devtools, что когда я нажимаю на кнопку, отправляется новая форма / tbody. Но она не вставляется в DOM, вместо этого htmx сообщает мне, что не нашел следующего tbody
.
Когда я ввожу htmx.logAll()
в консоль, чтобы понять, что происходит, я получаю сообщение об ошибке, что htmx не определен (WTF? Он есть и частично работает, как он может быть не определен?)
Когда я пытаюсь использовать отладочное расширение - тот же результат, htmx не определен.
Я просмотрел предыдущую версию кода (когда htmx работал как надо) и не нашел никаких различий в html между рабочей и нерабочей версией... Итак, еще раз: WTF?!
Я ищу ошибку уже два дня, поэтому немного расстраиваюсь. Есть ли у кого-нибудь подсказка, почему это не работает так, как ожидалось, почему это внезапно перестало работать и что мне нужно изменить, чтобы это заработало?
Чуть не забыл... Нет, я не обновлял HTMX до версии 2, так что это не может быть проблемой.
Приветствия Андре