Django views.py : невозможно использовать доступную внешнюю функцию

#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» ? Да, это так..