Как использовать в Django {% querystring %} с GET-формой?

В Django 5.1 было добавлено {% querystring %}. Есть ли способ использовать его с GET-формой?

Например, допустим, у нас есть шаблон с:

<span>Paginate by:</span>
<a href="{% querystring paginate_by=50 %}">50</a>

{# ... #}

<form method="GET">
    <input name="query" value="{{ request.GET.query }}">

    <button type="submit">Search</button>
</form>

Предполагая, что мы сейчас находимся на localhost:8000/?paginate_by=50, как изменить form так, чтобы нажатие Search не удаляло paginate_by параметр запроса - так что то, что я хочу, это, например, localhost:8000/?paginate_by=50&query=abc, а не localhost:8000/?query=abc?

До версии 5.1 я решал эту проблему с помощью предоставления формы со скрытыми полями на основе параметров GET, но я надеюсь, что теперь возможно более элегантное решение.

Мы можем динамически отобразить все параметры запроса как скрытые поля с помощью request.GET в Django и цикла for в шаблоне:

<form method="GET">
<input type="text" name="query" value="{{ request.GET.query }}">

<!-- Loop through all GET parameters dynamically -->
{% for key, value in request.GET.items %}
    {% if key != 'query' %} <!-- Avoid duplicating the 'query' parameter -->
        <input type="hidden" name="{{ key }}" value="{{ value }}">
    {% endif %}
{% endfor %}

<button type="submit">Search</button>

Есть ли способ использовать его с формой GET?

Нет. {% querystring … %} используется тег шаблона [Django-doc] для генерации кверистрок. Это не то, что должен делать элемент формы.

Если вы добавите строку запроса в конце action=".." [mdn-doc] для формы, которая делает GET-запрос, то браузер обычно удаляет строку запроса.

Вы, вероятно, можете использовать тег шаблона и некоторый JavaScript, который при отправке формы получает данные из формы и из {% querystring %} (или, возможно, лучше, window.location.search от JavaScript), и смешивает их вместе. Таким образом, вы предотвращаете стандартный поток формы, но для его обработки требуется некоторый JavaScript.

I would however advise not to manually render HTML forms if you are searching. You can use django-filter [GitHub] to automatically generate a filter form, that will thus preserve other options.

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