Django и HTMX Я ищу не "халтурный" способ обновить класс ссылки, которая вызывает запрос HTMX. Например, "refresh-self" или что-то в этом роде.
У меня проблема с HTMX в Django. У меня есть два важных компонента на странице. Список категорий и контент, который показывается после нажатия на категорию.
Я прекрасно работал со стандартным htmx "из коробки". Но у меня начались проблемы, когда я захотел добавить active
css класс на ссылку категории после нажатия на нее (чтобы показать пользователю, где он сейчас находится).
Я проделал много экспериментов с hx-swap-oob
и hx-swap
, но единственное, что сработало, было следующее:
(это наиболее значимая часть кода)
<div class="col-sm-4">
<div class="card">
<div class="card-body" hx-boost="true" hx-target="#manual_results">
<div id="manual_categories">
{% include 'partials/manual_categories.html' %}
</div>
</div>
</div>
</div>
<div class="col-sm-8">
<div id="manual_results">
{% include 'partials/manual_entries_list.html' %}
</div>
</div>
и в manual_entries_list.html
:
<some html results>
<div id="manual_categories" hx-swap-oob="true">
{% include 'partials/manual_categories.html' %}
</div>
Каждая категория имеет простой оператор if в коде шаблона django, который проверяет, выбрана ли она (на основе пути url.)
И это работает, дело в том, что при первом запросе категории отображаются дважды (что логично, так как у меня 2 include на одном HTML). После того, как я выбираю одну категорию, все приходит в норму, потому что HTMX "начинает понимать, что происходит" и переключает категории из manual_entries_list.html
на нашу главную страницу.
Как я и говорил, это работает, я изменил manual_entries_list.html
на:
<some html results>
<div class="set_size_to_0px">
<div id="manual_categories" hx-swap-oob="true">
{% include 'partials/manual_categories.html' %}
</div>
</div>
Поэтому он всегда невидим (поэтому у меня будет виден только один набор категорий).
Дело в том, что это очевидный взлом. Я уверен, что должен быть лучший способ решения этой проблемы, но я не могу найти его.
(я даже пытался сделать это с помощью обычного javascript, но дело в том, что категории выводятся в цикле for, поэтому практически невозможно правильно получить ID и т.д.)
Мог бы кто-нибудь мне помочь?
Самый простой способ избежать этой проблемы - определять HTMX-запрос в функции view, передавать это состояние вашим шаблонам и выводить HTMX-контент только в случае необходимости. HTMX будет добавлять заголовок HX-Request: true к каждому запросу.
Для обнаружения вы можете использовать пакет Django-HTMX, который предоставляет request.htmx
переменную в ваших функциях представления, которая будет True
если запрос приходит из HTMX. Или если вы хотите проверить это вручную:
def my_view(request):
is_htmx = request.headers.get('HX-Request') == 'true'
return render(request, 'my_template.html', {'is_htmx': is_htmx})
После этого в шаблон manual_entries_list.html
включайте материалы, связанные с HTMX, только в запросы HTMX:
<some html results>
{% if is_htmx %}
<div id="manual_categories" hx-swap-oob="true">
{% include 'partials/manual_categories.html' %}
</div>
{% endif %}