#python #html #django #django-views #django-forms
#python #HTML #django #django-просмотры #django-forms
Вопрос:
Я хочу, чтобы при заполнении формы django открывалась новая страница — нажав enter / нажав на ввод «Поиск» и отобразив результаты на этой странице, используя данные, введенные в форме.
forms.py:
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'),
]
Я извлек данные, введенные в from by form1.cleaned_data['Search']
.
form_input=form1.cleaned_data['Search']
Однако, как только страница результатов открывается, она показывает, что данные (form_input) не определены.
Отображается следующая ошибка:
name 'form_input' is not defined
Я не могу использовать эти данные (form_input) в любой другой функции views.py
файла.
views.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
переменную.
Ответ №1:
Вам нужно будет сделать что-то вроде этого:
views.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>
И result.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 пользователя с такими именами, как Tom Jablinski, Tommy Joe и Jack White (например), и вы искали Tom, вы получили бы набор запросов, содержащий 2 пользовательских объекта: Tom Jablinski и Tommy Joe, и они отображались бы в result.html
temaplte.
Комментарии:
1. Что вы подразумеваете под «search_result = #ваш поисковый запрос с использованием переменной form_input» ? Да, это так..