Как создать приложение django, выполняющее поиск в google

Я хочу сделать приложение Django, которое ищет в google строку и затем сохраняет html-страницу.

пока мне удалось

создайте это

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">





<div class="container text-center">
    <h1>my search engine</h1>
    <h3>Pressing search will run a google search for 'lallero search', then the code will scrape the first 5 links in that google search and store the corresponding html.</h3>
    <a href="{% url 'about' %}">About page</a>
    <br>
    <br>
    <form action="{% url 'search' %}">



    <input type='submit' value='search' class="btn btn-primary">



    </form>
</div>

который ищет в google очень конкретную строку и это просто нажатие кнопки. Я хотел бы добавить форму, где я могу написать строку, которую я хочу искать, а затем передать ее в качестве ввода в мою функцию "поиск"

пока что у меня получилось следующее

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">


<div class="container text-center">
    <h1>my search engine</h1>
    <a href="{% url 'about' %}">About page</a>
    <br>
    <br>
    <form action="{% url 'search' %}">

  <input type="search" value='lallero search' class="form-control rounded" placeholder="Search" aria-label="Search"
    aria-describedby="search-addon" />
  <button type="button" class="btn btn-outline-primary">search</button>
</div>

но я не знаю, как передать строку, которую я пишу, как вход в функцию.

любой совет?

Кратко говоря, в вашем представлении, которое вызывается формой, можно получить доступ к данным вашей формы с помощью request.GET, request.POST. Поскольку его поисковая функциональность get метод должен быть использован. И ваш ввод будет в вашем кверистинге чем-то вроде www.yourdomain.com/search-view?search=input.Вместо доступа к нему с помощью request.GET["search"], django forms будет лучшим выбором. В вашем случае

from django import forms

class SearchForm(forms.Form):
    search = forms.CharField(required=True, max_lenght=255, label="Search")

И вы можете использовать его в своем шаблоне как

<form action="{% url 'search' %}">
  {{ form.non_field_errors }}
  {{ form.as_p }} <!-- This will create a text input with attributes -->
  <input type="submit" value="Submit">
</form>

И вы можете использовать его в своем представлении;

from . import SearchForm

form = SearchForm(request.GET) 
if form.is_valid(): # this will validate your form 
    search_text = form.cleaned_data["search"] # now you can access input

Посмотрите, пожалуйста, работа с формами.

Редактирование:

def search(request):
    if request.method == 'GET':
        # create a form instance and populate it with data
        form = SearchForm(request.GET)
        # check whether it's valid:
        if form.is_valid():
            print("Form is valid now you can process your data")
            # return a response or render a different template
            return HttpResponseRedirect('/redirect-url/') 
        # if not render the form back
            return render(request, 'your_template.html', {"form": form})
    # Assume post method is not allowed
    return HttpResponseNotAllowed()

После ответа @berkeeb я изменил код таким образом.

Я создал файл forms.py с:

from django import forms


class SearchForm(forms.Form):
    search = forms.CharField(required=True, max_length=255, label="search")

в моем шаблоне (home.html) я использовал:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">



<div class="container text-center">
    <h1>my search engine</h1>
    <a href="{% url 'about' %}">About page</a>
    <br>
    <br>
        <form action="{% url 'search' %}">
    <label for="search_text">Your search: </label>
    <input id="search_text" type="text" name="search_text">
    <input type="submit" value="Search">
</form>
</div>

и, наконец, в функции поиска я написал:

def search(request):
    form = SearchForm(request.GET)
    search_text = form.data["search_text"]  # now you can access input
    urls = searchWeb(num=5, stop=5, query_string=search_text)

    threads = [threading.Thread(target=getSavePage, args=(url,)) for url in urls]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()
    return render(request, "engine/search.html", {"search": urls})

В основном, мне пришлось удалить часть формы с валидацией, так как я продолжал получать статус unknown.

Вернуться на верх