Как создать приложение 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.