Как использовать в 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.