Конкретный контент любого сайта обычно извлекается пользователями через поиск Google, Yandex или другие поисковые системы. Однако, если этот вариант поиска реализован на веб-сайте, пользователи могут легко найти желаемый контент на сайте без использования поиска Google. Еще одно преимущество добавления опции поиска на веб-сайт заключается в том, что разработчик может правильно управлять результатами поиска. Это означает, что он может контролировать, какое содержимое сайта будет отображаться или нет. В этой статье будет показан процесс реализации базового поиска на сайте 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. Поле типа таблицы книг – это внешний ключ, который появится из таблицы типов книг.
# Импортировать необходимые модули 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 отобразит результат поиска после отправки формы поиска.
<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>
<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>
<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.
# Импортировать необходимые модули 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().
# Импортировать админ-модуль 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 смогут реализовать функцию поиска на своем веб-сайте после прочтения этого руководства.