Я хочу, чтобы новая страница открывалась при заполнении формы django - нажатием ввода/нажатием на ввод «Поиск» и отображением результатов на этой странице с использованием данных, введенных в форму.
формы.ру:
class SearchBar(forms.Form):
Search = forms.CharField(label='', max_length=100, widget=forms.TextInput)
HTML-страница с формой выглядит так:
index.html
<form class = "" action = "result" method = "post">
{% csrf_token %}
{{ form1.as_table }}
<input class = "Search" type = "submit" name = "" value = "Search">
</form>
Я хочу, чтобы отправка этой формы открывала новую страницу: result.html
Я установил URL-адрес «результата» на указанную HTML-страницу:
urls.py
urlpatterns=[
path('result', views.result, name='result'),
]
Я извлек данные, введенные в form1.cleaned_data['Search']
.
form_input=form1.cleaned_data['Search']
Однако, как только страница результатов открыта, она показывает, что данные (form_input) не определены. Отображается следующая ошибка:
name 'form_input' is not defined
Я не могу использовать эти данные (form_input) ни в какой другой функции файла views.py
.
просмотры.py
def index(request):
form1 = forms.SearchBar()
if request.method == "POST":
form1 = forms.SearchBar(request.POST)
if form1.is_valid():
global form_input
form_input= (form1.cleaned_data['Search'])
def result(request):
print(form_input)
Я не понимаю, почему это происходит. Я даже объявил переменную form_input
как переменную global
.
Вам нужно будет сделать что-то вроде этого:
просмотры.py
from . forms import SearchBar
def search_view(request):
if request.method == "POST":
form = SearchBar(request.POST)
if form.is_valid():
form_input = form.cleaned_data['Search']
search_result = # your search query using the form_input variable
return render(request, "result.html", {"search_result ": search_result })
Если я правильно понимаю, вы хотели бы иметь свою панель поиска в base.html (базовый шаблон, от которого наследуются все остальные шаблоны), тогда там, где ваша панель поиска в шаблоне будет, напишите что-то вроде этого:
<form action = {% url 'search_view' %} method = "post">
{% csrf_token %}
{{ form.as_p }}
<button type = "submit">Search</button>
</form>
И результат.html будет выглядеть так:
{% for item in search_result %}
{{ i.name }}
{% endfor %}
ОБНОВЛЯТЬ
Ну, очевидно, цель панели поиска — фильтровать и отображать объекты данной модели/моделей, например, если у вас была модель User
:
class User(models.Model):
name = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
и хотел отфильтровать объекты на основе вашего user.name
, тогда строка кода будет выглядеть примерно так:
search_results = User.objects.filter(name__contains=form_input)
Таким образом, если у вас есть, например, 3 пользователя с такими именами, как Том Яблински, Томми Джо и Джек Уайт (например), и вы ищете Тома, вы получите набор запросов, содержащий 2 пользовательских объекта: Том Яблински и Томми Джо, и они будут отображаться в result.html
темплейт.
Что вы подразумеваете под «search_result = #ваш поисковый запрос с использованием переменной form_input»? Да так бывает..