Цель
Я хочу сохранить запрос при отображении результата поиска. Вот пример, где строка поиска содержит stackoverflow
на странице результатов.
Неудачные решения
Это минимальные примеры кода
# search_results.html
<form action="/search" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Search">
</form>
# views.py
...
class SearchView(TemplateView):
"""Search view"""
def form_valid(self, form):
"""redirect to the success url with url params"""
quoted_user_query = urllib.parse.quote_plus(form.cleaned_data['user_query'])
return HttpResponseRedirect(''.join([self.get_success_url(), quoted_user_query]))
def get_context_data(self. **kwargs):
context = super().get_context(**kwargs)
user_query = self.request.GET.get('q', None)
form.initial = {'user_query': user_query}
return context
def get_success_url(self):
"""append success url with search query"""
if not self.success_url:
raise ImproperlyConfigured('No success url for {}'.format((str(self))))
return ''.join([str(self.success_url), '?q='])
При первом поиске в браузере шаблон отображается так, как ожидалось. Если я ищу foo
, то выводится
<form action="/search" method="post">
<input type="text" value="foo" name="search">
<input type="submit" value="Search">
</form>
Но поиск во второй раз не меняет строку в строке поиска. Если я ищу bar
после поиска foo
, значение строки поиска НЕ изменится на bar
, как ожидалось.
<form action="/search" method="post">
<input type="text" value="foo" name="search">
<input type="submit" value="Search">
</form>
Что я делаю не так? Ниже приведен код формы.
# forms.py
from django import forms
class SearchBar(forms.Form):
user_query = forms.CharField()
EDIT: Когда я добавил {{form.initial.user_query}} в шаблон, ожидаемое значение отображается в виде текста рядом с панелью поиска. , но НЕ отображается в строке поиска.
# search_results.html
{{ form.initial.user_query }}
<form action="/search" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Search">
</form>
bar
<form action="/search" method="post">
<input type="text" value="foo" name="search">
<input type="submit" value="Search">
</form>