Динамический поиск HTMX с кнопкой "назад" в веб-браузере

Я хотел использовать динамический поиск по htmx в djnago, но у меня проблема: поиск работает, но после входа в DetailView искомого элемента и возврата в ListView кнопкой назад в браузере, в inputs есть данные поиска, но фильтр не работает, у меня полный список.

Форма поиска:

<form id="serach_form" hx-post = "{% url 'geo_service:filter-ots' %}"
hx-target='#results'
hx-trigger="change">   
    {% csrf_token %}    
    <div class="row g-3 align-items-center pb-4">
        <div class="col-6">
          <input type="text"
          id="search_name_input"
          hx-post = "{% url 'geo_service:filter-ots' %}"
          hx-target='#results'
          hx-trigger="keyup changed delay:500ms"
          name="ots_search_name" 
          class="form-control"  
          placeholder="OTS Name input">
        </div>
        <div class="col-auto">
            <div class="form-check form-check-inline">
                <input class="form-check-input" type="checkbox" id="inlineCheckbox1" name="ots_search_otdrSupported" value="option1" checked>
                <label class="form-check-label" for="inlineCheckbox1">otdrSupported</label>
            </div>
            <div class="form-check form-check-inline">
                <input class="form-check-input" type="checkbox" name="ots_search_fiberAscStatus" id="inlineCheckbox2" value="option2" >
                <label class="form-check-label" for="inlineCheckbox2">fiberAscStatus</label>
            </div>
        </div>
      </div>
</form> 

Просмотров:

class OtsListView(LoginRequiredMixin, generic.ListView):
    template_name = 'geo_service/ots_list.html'
    queryset = ConnectionOts.objects.filter(active = True, otdrSupported = "Boolean_true")
   
def filter_ots(request):
    ots_search_name = request.POST.get('ots_search_name')
    ots_search_otdrSupported = request.POST.get('ots_search_otdrSupported')
    ots_search_fiberAscStatus = request.POST.get('ots_search_fiberAscStatus')

    condition = Q(guiLabel__icontains = ots_search_name)
    if ots_search_otdrSupported:
        condition &= Q(otdrSupported = "Boolean_true")
    if ots_search_fiberAscStatus:
        condition &= Q(fiberAscStatus = "Boolean_true")
 
    results = ConnectionOts.objects.filter(condition)
    context = {'object_list': results}
 
    return render(request, 'geo_service/partials/ots_results.html',context)

Я пытался вручную принудительно вызвать событие, чтобы заставить htmx работать, но это не работает.

   var btnBack = performance.getEntriesByType("navigation");
    if (btnBack[0].type === "back_forward") {
        form_search = document.getElementById('serach_form')
        var event = new Event('change',{ bubbles: true })
        form_search.dispatchEvent(event);
    };

Буду благодарен за предложения о том, как это сделать.

При возврате форма заполняется браузером, но отображается вид из URL поиска без дополнительной информации о состоянии фильтра. Я бы рекомендовал использовать метод GET на форме с комбинацией изменения URL с hx-push-url="true". Таким образом, при возврате функция просмотра получит информацию о фильтрации в параметрах GET.

Также при переходе назад/вперед может случиться, что HTMX запрашивает полную страницу вместо только частичной. Проверьте docs и заголовок HX-History-Restore-Request.

Вернуться на верх