No Django 5.1 {% querystring %} foi adicionado. Existe alguma maneira de usá-lo com o formulário GET?
Por exemplo, digamos que temos um modelo com:
<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>
Supondo que estamos atualmente em localhost:8000/?paginate_by=50
, como alterar form
para que clicar Search
não exclua paginate_by
o parâmetro de consulta - então o que eu quero é por exemplo localhost:8000/?paginate_by=50&query=abc
e não localhost:8000/?query=abc
?
Antes da versão 5.1, eu lidava com isso fornecendo um formulário com campos ocultos com base em parâmetros GET, mas espero que agora seja possível uma solução mais elegante.
Não ., a
{% querystring … %}
tag de template [Django-doc] é usada para gerar querystrings. Não é isso que um elemento de formulário deve fazer.Se você adicionar uma string de consulta no final do
action=".."
[mdn-doc] para um formulário que faz uma solicitação GET, o navegador normalmente removerá a string de consulta.Você provavelmente pode fazer uso da tag template e algum JavaScript que, assim, ao enviar o formulário, obtém os dados do formulário e do
{% querystring %}
(ou, provavelmente, melhor, do JavaScriptwindow.location.search
), e mistura tudo isso. Então, você previne o fluxo de formulário padrão, mas ele requer algum JavaScript para lidar com isso.No entanto, eu aconselharia não renderizar manualmente formulários HTML se você estiver pesquisando. Você pode usar [GitHub] para gerar automaticamente um formulário de filtro, que preservará outras opções.
django-filter
Podemos renderizar dinamicamente todos os parâmetros de consulta como campos ocultos usando request.GET do Django e um loop for no modelo: