Как создать базовый поиск для сайта Django?

Конкретный контент любого сайта обычно извлекается пользователями через поиск Google, Yandex или другие поисковые системы. Однако, если этот вариант поиска реализован на веб-сайте, пользователи могут легко найти желаемый контент на сайте без использования поиска Google. Еще одно преимущество добавления опции поиска на веб-сайт заключается в том, что разработчик может правильно управлять результатами поиска. Это означает, что он может контролировать, какое содержимое сайта будет отображаться или нет. В этой статье будет показан процесс реализации базового поиска на сайте Django.
Предпосылки:
Перед тем, как практиковать сценарий этого руководства, вам необходимо выполнить следующие задачи:
- Установите Django версии 3+ на Ubuntu 20+ (желательно)
- Создайте проект Django
- Запустите сервер Django, чтобы проверить, работает ли сервер правильно или нет.
Настройте приложение Django:
Выполните следующую команду, чтобы создать приложение Django с именем searchchapp.
$ python3 manage.py startapp searchapp
Выполните следующую команду, чтобы создать пользователя для доступа к базе данных Django. Если вы создали пользователя раньше, вам не нужно запускать команду.
$ python3 manage.py createsuperuser
Добавьте имя приложения в часть INSTALLED_APP файла settings.py.
INSTALLED_APPS = [ ….. 'searchapp' ]
Создайте папку с именем templates внутри папки searchchapp и укажите местоположение шаблона приложения в части TEMPLATES файла settings.py.
TEMPLATES = [
{
….
'DIRS': ['/home/fahmida/django_pro/searchapp/templates'],
….
},
]
Создать модели:
Измените файл models.py с помощью следующего сценария. Здесь были определены два класса для создания двух реляционных таблиц с именами booktypes и books. Поле типа таблицы книг — это внешний ключ, который появится из таблицы типов книг.
models.py
# Импортировать необходимые модули
from django.db import models
from django.urls import reverse
# Создать модель
class Booktype(models.Model):
btype = models.CharField(max_length=100, unique=True)
class Meta:
ordering=('btype',)
# Создайте модель gor book
class Book(models.Model):
book_name = models.CharField(max_length=150)
author_name = models.CharField(max_length=150)
type = models.ForeignKey(Booktype, on_delete=models.CASCADE)
price = models.FloatField()
publication = models.CharField(max_length=100)
class Meta:
ordering=('book_name',)
def __str__(self):
return self.book_name
def get_url(self):
return reverse('book_detail', args=[self.id])Создать шаблоны для поиска:
Для создания функции поиска, показанной в этой статье, вам потребуются три файла HTML. Это book_list.html, book_detail.html и search.html. Book_list.html отобразит все записи из таблицы books. Book_detail.html отобразит подробную информацию о конкретной книге. Search.html отобразит результат поиска после отправки формы поиска.
book_list.html
<html>
<head>
<title>Book List</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<div class="container">
<div>
<br/>
<form action="{% url 'search' %}" class="form-inline" method="get">
<div class="form-group mb-8">
<h1>{% if type %}{{ type.name }}{% else %} Список книг {% endif %}</h1>
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="" class="sr-only">поиск</label>
<input name="search" type="" class="form-control" id="" placeholder="Keyword">
</div>
<button type="submit" class="btn btn-success btn-lg mb-2">Поиск</button>
</form>
<br/>
{% for x in book %}
<h3> <a href="{{ x.get_url }}">{{x.book_name}}</a></h3>
<p class="lead">by {{x.author_name}}</p>
<p class="lead">${{x.price}}</p>
<hr>
{% endfor %}
</div>
</div>
</body>
</html>
book_detail.html
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<title>{{book.book_name}}</title>
</head>
<body>
<div class="container">
<br/><br/>
<h2 class="text-center"> {{book.book_name}}</h2>
<hr>
<p class="lead">Автор: {{book.author_name}} </p>
<p class="lead">Тип: {{type}} </p>
<p class="lead">Публикация: {{book.publication}} </p>
<p class="lead">Цена: ${{book.price}} </p>
<form action="{% url 'book_list' %}" class="form-inline" method="get">
<button type="submit" class="btn btn-primary btn-lg mb-2">Назад</button>
</form>
</div>
</body>
</html>
search.html
<html>
<head>
<title>Search Result</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<br/></br/>
<div class="container">
<div class="col-md-8 offset-md-2">
{% if query %}
<h2>
{% with results.count as total_results %}
Found {{ total_results }} result{{ total_results|pluralize }}
{% endwith %}
</h2>
{% for c in results %}
<a href="{{c.get_url}}"><h3>{{c.book_name}}</h3></a>
<h3>{{c.author_name}}</h3>
{% empty %}
<h3>No results found.</h3>
{% endfor %}
{% endif %}
<form action="{% url 'book_list' %}" class="form-inline" method="get">
<button type="submit" class="btn btn-primary btn-lg mb-2">Назад</button>
</form>
</div>
</div>
</body>
<html>
Создание функций просмотра:
Измените файл views.py с помощью следующего сценария. В скрипте определены три функции. Функция book_list() отобразит файл book_list.html. Функция book_detail() отобразит файл book_detail.html. Функция search() будет искать записи на основе данных, отправленных формой поиска, и отображать результат в search.html.
views.py
# Импортировать необходимые модули
from django.shortcuts import render,get_object_or_404
from .models import Book, Booktype
from django.db.models import Q
# Определите функцию для отображения всех книг
def book_list(request):
book = Book.objects.all()
return render(request, 'book_list.html', {'book': book })
# Определите функцию для отображения конкретной книги
def book_detail(request,id):
book = get_object_or_404(Book, id=id)
types = Booktype.objects.all()
t = types.get(id=book.type.id)
return render(request, 'book_detail.html', {'book': book, 'type': t.btype})
# Определить функцию для поиска книги
def search(request):
results = []
if request.method == "GET":
query = request.GET.get('search')
if query == '':
query = 'None'
results = Book.objects.filter(Q(book_name__icontains=query) | Q(author_name__icontains=query) | Q(price__icontains=query) )
return render(request, 'search.html', {'query': query, 'results': results})
Задайте пути для вызова функций просмотра:
Измените файл urls.py проекта Django с помощью следующего скрипта. В скрипте определены четыре пути. Путь admin/ используется для открытия административной панели Django. Пустой путь (») используется для вызова функции book_list (). Путь ‘<int: id>/’ используется для вызова функции book_detail(). Путь search/ используется для вызова функции search().
urls.py
# Импортировать админ-модуль
from django.contrib import admin
# Импортировать модуль пути
from django.urls import path
# Импортировать представление
from searchapp import views
# Определить пути
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.book_list, name='book_list'),
path('/', views.book_detail, name='book_detail'),
path('search/', views.search, name='search'),
]
Запустите приложение из браузера:
Выполните следующую команду, чтобы запустить сервер Django.
$ python3 manage.py runserver
Запустите следующий URL-адрес из любого браузера, чтобы отобразить список книг из таблицы.
http://localhost:8000
Если пользователь щелкнет ссылку «PHP и MySQL для динамических веб-сайтов», подробности этой книги появятся в браузере.
Если пользователь ищет слово, физика в браузере, то в браузере отобразится следующий результат поиска.
Заключение:
Приложение Django с опцией базового поиска было реализовано в этой статье с использованием таблиц базы данных. Новые разработчики Django смогут реализовать функцию поиска на своем веб-сайте после прочтения этого руководства.
Редактор: AndreyEx