Обновление Form.intial не меняет первоначальное значение в шаблоне Django - PullRequest
0 голосов
/ 10 марта 2020

Цель

Я хочу сохранить запрос при отображении результата поиска. Вот пример, где строка поиска содержит 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>

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Я не думаю, что вы получаете какое-либо значение с self.request.GET.get('q', None), потому что имя поля ввода user_query в формах. Поэтому попробуйте так:

class SearchView(TemplateView):
    """Search view"""
    def get_context_data(self. **kwargs):
        context = super().get_context(**kwargs)
        user_query = self.request.GET.get('user_query', None)
        context['form'] = SearchBar(initial = {'user_query': user_query})
        return context

Также измените метод формы с поста, чтобы получить ie <form method='get' action='/search'>

0 голосов
/ 11 марта 2020

Я нашел неуклюжее решение, которое создает новый экземпляр формы вместо обновления атрибута initial

# views.py
...
class SearchView(TemplateView):
    """Search view"""
extra_context = {'form': SearchBar()}

    def get_context_data(self. **kwargs):
        context = super().get_context(**kwargs)
        user_query = self.request.GET.get('q', None)
        if user_query is not None:
            context['form'] = self.form_class(data={'user_query': user_query})
        return context
...
...