Django как сделать поиск по сайту
Перейти к содержимому

Django как сделать поиск по сайту

  • автор:

Как создать базовый поиск для сайта Django? 5 мин для чтения

PlayStation размахивает молотком запретов так, как мечтают игроки Xbox

Favorite

Добавить в избранное

Главное меню » Новости » Как создать базовый поиск для сайта Django?

Как установить и подключиться к интерфейсу администратора Django

Конкретный контент любого сайта обычно извлекается пользователями через поиск Google, Yandex или другие поисковые системы. Однако, если этот вариант поиска реализован на веб-сайте, пользователи могут легко найти желаемый контент на сайте без использования поиска Google. Еще одно преимущество добавления опции поиска на веб-сайт заключается в том, что разработчик может правильно управлять результатами поиска. Это означает, что он может контролировать, какое содержимое сайта будет отображаться или нет. В этой статье будет показан процесс реализации базового поиска на сайте Django.

Предпосылки:

Перед тем, как практиковать сценарий этого руководства, вам необходимо выполнить следующие задачи:

  1. Установите Django версии 3+ на Ubuntu 20+ (желательно)
  2. Создайте проект Django
  3. Запустите сервер 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 отобразит результат поиска после отправки формы поиска.

Читать Chieftec продлевает гарантию на блоки питания Polaris Pro и Polaris 3.0 до пяти лет

book_list.html

  Book List    

> Список книг

>">>

by >

$>

book_detail.html

    >   


>


Автор: >

Тип: >

Публикация: >

Цена: $>

search.html

Search Result

Found > result> >»>

>

>

No results found.

Назад

Создание функций просмотра:

Измените файл 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', ) # Определите функцию для отображения конкретной книги 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', ) # Определить функцию для поиска книги 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', )

Задайте пути для вызова функций просмотра:

Измените файл urls.py проекта Django с помощью следующего скрипта. В скрипте определены четыре пути. Путь admin/ используется для открытия административной панели Django. Пустой путь (») используется для вызова функции book_list (). Путь ‘/’ используется для вызова функции 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-адрес из любого браузера, чтобы отобразить список книг из таблицы.

Читать Чип Intel Core i9-13900K ES разгоняется до 5,5 ГГц

Если пользователь щелкнет ссылку «PHP и MySQL для динамических веб-сайтов», подробности этой книги появятся в браузере.

Если пользователь ищет слово, физика в браузере, то в браузере отобразится следующий результат поиска.

Заключение:

Приложение Django с опцией базового поиска было реализовано в этой статье с использованием таблиц базы данных. Новые разработчики Django смогут реализовать функцию поиска на своем веб-сайте после прочтения этого руководства.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Полный гид по созданию поиска на сайте с помощью Django

Узнайте, как настроить поиск на своем сайте на базе Django с помощью простых инструкций и рекомендаций. Улучшите пользовательский опыт и повысьте удобство использования вашего сайта уже сегодня!

Создание поиска на сайте – одна из наиболее важных функций для пользовательского опыта. Вместе с тем, для веб-разработчиков это может оказаться сложным и трудоемким процессом. В этой статье мы рассмотрим пошаговое руководство по созданию поиска на сайте с помощью Django, популярного фреймворка для веб-разработки на Python.

Мы начнем с настройки обработчика поисковых запросов и создания модели данных, где будут храниться результаты поиска. Затем мы рассмотрим создание представления и шаблона, описывающего интерфейс поиска на странице.

В конце мы рассмотрим способы оптимизации поиска и улучшения его функциональности. Если вы хотите улучшить пользовательский опыт на вашем сайте через поиск, то эта статья – для вас.

Начало работы с Django

Начало работы с Django

Django — это веб-фреймворк, работающий на языке Python. Он позволяет создать веб-приложение с минимальными усилиями и безопасным кодом.

Первым делом нам нужно установить Django на наш компьютер. Для этого необходимо убедиться, что у вас установлен Python версии не ниже 3.6.

  • Скачайте и установите Python https://www.python.org/downloads/
  • Установите virtualenv — инструмент, позволяющий создавать изолированные окружения для проектов с разными зависимостями. Для установки введите в командной строке: pip install virtualenv
  • Создайте виртуальное окружение. Введите в командной строке: virtualenv env_name
  • Активируйте виртуальное окружение. Введите в командной строке: source env_name/bin/activate
  • Установите Django. Введите в командной строке: pip install Django

После установки Django мы можем начать создавать новый проект. Для этого введите в командной строке: django-admin startproject project_name

Теперь у нас есть базовая структура проекта, и мы можем начать создавать приложения внутри проекта. Для этого введите в командной строке: python manage.py startapp app_name

После этого мы можем начать написание кода на Python, который будет взаимодействовать с базой данных и отображать данные на страницах сайта.

Установка Django

Для начала работы с Django необходимо его установить. Существует несколько способов установки Django, но наиболее простой и удобный способ — это использование пакетного менеджера pip, который установлен вместе с Python.

Для установки Django необходимо выполнить команду:

pip install Django

После выполнения этой команды будет установлена последняя версия Django. Если же требуется установить определенную версию, то нужно указать ее номер:

pip install Django==2.2

Чтобы убедиться, что установка прошла успешно, можно выполнить команду:

django-admin —version

Если все установлено правильно, то эта команда выведет номер версии Django:

Настройка окружения

Настройка окружения

Прежде чем начать создавать поиск на сайте с помощью Django, необходимо настроить локальное окружение для разработки. Ниже приведены необходимые шаги:

  1. Установка Python — Django написан на Python, поэтому для его запуска нужно установить Python версии 3.7 и выше. Python можно скачать с официального сайта Python.org.
  2. Установка pip — pip используется для установки сторонних библиотек и пакетов для Python. Для установки pip необходимо прописать команду в терминале: sudo apt-get install python3-pip (для Linux) или скачать установочный файл с официального сайта Python.org (для Windows).
  3. Установка virtualenv — virtualenv используется для создания виртуальной среды разработки для проекта. Это позволяет изолировать пакеты проекта от пакетов, установленных глобально на компьютере. Для установки virtualenv нужно прописать команду в терминале: pip3 install virtualenv.

После выполнения вышеперечисленных шагов можно создавать виртуальную среду для проекта, устанавливать Django и необходимые пакеты и начинать разработку поиска на сайте с помощью Django.

Создание поиска на сайте

Создание поиска на сайте является важным элементом, который помогает пользователям быстро находить необходимую информацию. Для реализации поиска на сайте можно использовать множество инструментов и технологий. Одним из таких инструментов является фреймворк Django.

С помощью Django можно легко создавать поиск на сайте. Для этого необходимо определить модель данных, по которой будет проходить поиск. Далее необходимо создать представление, в котором будет реализован поиск, и шаблон, который отображает результаты поиска.

Реализация поиска с помощью Django дает возможность управлять результатами, добавлять фильтры, сортировки и различные критерии поиска. Такой подход позволяет пользователю находить интересующую информацию на сайте быстро и удобно.

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

В целом, создание поиска на сайте является важным этапом его разработки. Правильная реализация поиска поможет улучшить пользовательский опыт и повысить степень удовлетворенности пользователей от работы с сайтом.

Создание модели данных

Для создания поиска на сайте в Django сначала нужно определить модель данных. Модель данных определяет, какие данные будут храниться в базе данных и как они будут связаны между собой.

В Django модель данных определяется как класс, унаследованный от класса Model. Каждый атрибут класса соответствует полю таблицы в базе данных. Определяя модель данных, нужно указать поля, которые будут сохраняться в базе данных.

Например, для создания модели данных для поиска постов на сайте достаточно определить поля, такие как заголовок, текст, дата создания и автор.

  • title — название поста, тип поля CharField
  • content — содержание поста, тип поля TextField
  • created_date — дата создания поста, тип поля DateTimeField
  • author — автор поста, тип поля ForeignKey

Поле ForeignKey указывает на связь между таблицами. В данном случае автором поста может быть любой пользователь, определенный в модели данных User.

Создание формы для поиска

Для того чтобы пользователи могли искать информацию на вашем сайте, необходимо создать форму для поиска. В Django это можно сделать очень просто, используя стандартный виджет формы SearchForm.

Начните с создания файла forms.py, в котором определите класс SearchForm:

from django import forms

В данном примере мы создаем форму с единственным полем для ввода запроса query, которое может содержать до 100 символов.

Теперь необходимо добавить эту форму на страницу. Для этого создайте шаблон с необходимой разметкой и добавьте на него тег form с указанием URL адреса для отправки запроса:

Тег form содержит атрибуты action, в котором указывается URL для обработки запроса, и method, указывающий метод передачи данных (GET или POST).

Поле для ввода запроса обозначается тегом input, в котором указывается атрибут name, соответствующий имени поля в форме SearchForm.

Кроме того, мы добавляем кнопку для отправки запроса, которая имеет тип submit.

Теперь вы можете перейти на страницу с формой поиска и проверить, что она работает:

Создание результатов поиска

После того как пользователь вводит запрос в поисковую строку и нажимает кнопку «Найти», необходимо отобразить результаты поиска на странице. Для этого мы можем использовать шаблон Django и циклы.

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

Далее, мы можем использовать цикл для итерации через каждый результат поиска и отобразить его на странице. Можно использовать список, который будет содержать каждый результат поиска, и затем использовать циклы для его отображения.

    ) или ordered list (
    ), чтобы отображать результаты в виде списка, а также использовать теги strong или em для выделения важной информации в результатах.

Наконец, мы можем добавить пагинацию для управления большим количеством результатов поиска. Для этого в Django есть встроенная пагинация, которую мы можем использовать для облегчения навигации по результатам.

Добавление функционала автодополнения

Автодополнение является очень удобной функцией для пользователей, так как она позволяет быстро находить нужный контент на сайте. Добавление автодополнения на сайт особенно важно для сайтов, которые имеют большой объем информации, таких как интернет-магазины или новостные порталы.

Для добавления функционала автодополнения на сайт, нужно подключить JavaScript библиотеку, которая отслеживает ввод пользователей. После этого нужно настроить AJAX-запросы, которые будут запрашивать данные с сервера, на основе введенного пользователем текста в поисковую строку.

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

Нужно помнить, что при добавлении автодополнения на сайт, нужно следить за скоростью работы сайта, так как хранимые данные и обработка запросов могут замедлять работу сайта. Важно также тщательно выбирать список слов или фраз, которые будут выводиться при вводе пользователем текста в поисковую строку. Это позволит ускорить работу автодополнения и улучшить опыт пользователей при работе с сайтом.

Добавление функционала сортировки

Для того чтобы добавить функционал сортировки на странице поиска, нужно внести изменения в код вашего представления (view). Для этого можно использовать метод order_by, который позволит отсортировать объекты модели по заданному полю.

Пример использования метода order_by:

results = Article.objects.filter(Q(title__icontains=query) | Q(content__icontains=query))

if sort_by == ‘title’:

elif sort_by == ‘date’:

return render(request, ‘search.html’, context)

В данном примере мы добавили переменную sort_by, которая содержит значение поля, по которому нужно отсортировать результат поиска. Далее мы использовали метод order_by, передав ему имя поля, по которому нужно сортировать. В случае, если выбрано поле «date», мы передаем в метод значение «-» и имя поля, чтобы осуществить обратную сортировку по дате публикации.

После этого нужно добавить возможность выбора поля сортировки на странице поиска. Для этого мы можем использовать элементы select и option:

В данном примере мы создали элемент select с двумя опциями option, каждая из которых отвечает за выбор сортировки по названию или по дате публикации. Атрибут «selected» устанавливает выбранное значение для каждой опции в зависимости от переданного параметра «sort_by».

Теперь на странице поиска появится выпадающий список, где пользователь сможет выбрать поле для сортировки результатов поиска.

Добавление пагинации

Для того, чтобы добавить пагинацию к результатам поиска на сайте, нужно сделать несколько шагов.

Во-первых, во вьюхе, которая выводит результаты поиска, нужно использовать объект класса Paginator, который предоставляет Django. Этот объект позволяет разбить выдачу на страницы.

Во-вторых, на странице с выводом результатов нужно добавить ссылки на другие страницы, если результатов больше, чем помещается на одну страницу. Для этого можно использовать классы в Bootstrap, например, класс pagination.

В-третьих, во вьюхе необходимо обработать параметры запроса, которые передают номер страницы и количество результатов на странице. Эти параметры можно получить с помощью объекта request.GET, и передать их в объект класса Paginator.

Таким образом, добавление пагинации к результатам поиска на сайте в Django не представляет большой сложности, и делает выдачу более удобной для пользователей. Важно правильно обработать параметры запроса и добавить соответствующие ссылки на страницы.

Тестирование поиска

Важной частью разработки поиска на сайте является тестирование. Нельзя допустить ситуацию, когда пользователь не может найти необходимую информацию из-за неправильной работы поиска.

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

Для тестирования советуем использовать реальные данные, которые пользователи могут ввести в поисковую строку. Оцените скорость поиска и убедитесь, что результаты отображаются корректно и актуально.

Если вы обнаружили ошибки в работе поиска, необходимо незамедлительно исправить их для обеспечения полноценной работы вашего сайта. Помните, что удобный и эффективный поиск — залог успеха вашего сайта.

Тестирование функциональности поиска

Тестирование функциональности поиска

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

В первую очередь, можно проверить, как работает поиск при использовании различных запросов. Например, можно ввести слово, которое точно есть на странице, и посмотреть, появится ли эта страница в результате поиска. Аналогично можно проверить поиск на наличие синтаксических ошибок, например, при использовании кавычек или логических операторов.

Также стоит проверить, как работает поиск при использовании разных языков. Если ваш сайт поддерживает несколько языков, необходимо убедиться, что поиск работает корректно на всех языках.

Другим важным аспектом является проверка скорости работы поиска. Необходимо убедиться, что поиск работает быстро, даже при использовании сложных запросов и большого количества данных.

Наконец, стоит убедиться, что результаты поиска являются релевантными и соответствуют запросу пользователя. Для этого можно использовать различные методы оценки релевантности результатов поиска.

В целом, тестирование функциональности поиска является важным этапом в разработке сайта. Правильно настроенный и хорошо работающий поиск поможет улучшить пользовательский опыт и увеличить эффективность сайта.

Вопрос-ответ:

Какие инструменты и библиотеки нужны для создания поиска на сайте с помощью Django?

Для создания поиска на сайте с помощью Django нужны инструменты для работы с базами данных (например, SQLite, PostgreSQL или MySQL), предоставляемые Django. Также нужно использовать библиотеку Haystack, которая позволяет быстро и удобно создавать поисковые индексы и запросы к ним.

Как создать модель для индексации данных поисковой системой Haystack?

Для создания модели для индексации данных с помощью Haystack, нужно создать класс, который будет унаследован от класса SearchIndex. Этот класс должен содержать информацию о том, какие поля нужно индексировать, какие поля нужно использовать для поиска и т.д. В классе нужно также определить метод prepare(), который будет определять, как данные будут индексироваться.

Как создать и настроить поисковый индекс в Haystack?

Для создания и настройки поискового индекса в Haystack нужно определить его структуру, т.е. какие поля будут индексироваться, какие поля будут использоваться для поиска, какая будет структура данных и т.д. Затем нужно создать экземпляр поискового индекса и настроить его параметры, например, указать, какой инструмент для работы с базой данных нужно использовать.

Как создать поисковую форму на странице сайта?

Для создания поисковой формы на странице сайта нужно создать класс формы, который будет унаследован от класса форм в Django. В этом классе нужно определить элементы формы (например, текстовое поле для ввода запроса), а также настроить их параметры (например, тип данных, которые могут быть введены в поле). После этого нужно создать функцию обработки запроса из формы, которая будет вызываться при отправке данных формы на сервер.

Как создать шаблон для отображения результатов поиска на странице сайта?

Для создания шаблона для отображения результатов поиска на странице сайта нужно определить блок(и) в HTML-разметке, где будут размещаться результаты. Затем нужно создать файл шаблона, который будет этот блок(и) содержать. В этом файле можно использовать переменные контекста, которые будут содержать результаты поиска, полученные из БД. В шаблоне можно использовать различные фильтры и теги для форматирования результатов и добавления дополнительной информации.

Какие методы могут использоваться для поиска данных в Haystack?

В Haystack существует несколько методов для поиска данных, например: search(), filter(), exclude(), order_by(), facet(), count() и другие. Метод search() используется для выполнения поискового запроса, метод filter() для фильтрации результатов, метод exclude() для исключения определенных значений из результатов, метод order_by() для сортировки результатов и т.д. В зависимости от задачи и требований к поиску можно выбрать наиболее подходящий метод.

Как улучшить поиск на сайте с помощью Haystack?

Для улучшения поиска на сайте с помощью Haystack можно использовать различные методы и техники, например: расширять функциональность индекса, добавлять в поисковый индекс дополнительные поля и модели, настраивать параметры поисковых запросов для улучшения точности и полноты результатов, использовать автодополнение и подсказки для пользователей и другие. Главное, чтобы поиск на сайте был максимально точным, быстрым и удобным для пользователей.

Тестирование производительности поиска

Тестирование производительности поиска

Для того, чтобы убедиться в эффективности работы поиска на сайте, необходимо провести тестирование производительности. Это поможет определить скорость поиска и нагрузку на сервер во время работы.

Один из способов тестирования — это использование инструментов для нагрузочного тестирования, таких как Apache JMeter, LoadRunner или Gatling. С их помощью можно создать сценарии поиска и провести тестирование на различных уровнях нагрузки.

Также можно использовать профилировщики кода, такие как PyCharm, для определения узких мест в работе алгоритмов поиска и оптимизации их работы.

Помимо этого, можно провести мониторинг производительности на реальных условиях, используя сервисы мониторинга, такие как NewRelic или DataDog. Они позволяют отслеживать работу сервера в режиме реального времени и вносить необходимые изменения для оптимизации работы.

Важно помнить, что тестирование производительности необходимо проводить на регулярной основе, чтобы следить за состоянием сервера и улучшать работу алгоритмов и производительность поисковой системы.

Руководство по созданию поиска на сайте в Django

Сегодня мы рассмотрим базовые аспекты, связанные с поиском по сайту Django, а также затронем способы улучшить его за счет задействования более продвинутых функций. Полный исходный код материалов этого урока можно найти на GitHub.

Начало работы

Сперва давайте создадим новый Django-проект. Необходимо открыть командную строку и ввести такие команды для установки последней версии.

Убедитесь в том, что у вас установлен Pipenv .

$ pipenv install django==2.2.1 $ pipenv shell $ django-admin startproject citysearch_project . $ python manage.py migrate $ python manage.py runserver

Последовательность действий следующая:

  1. Сначала устанавливается последняя версия Django с помощью Pipenv.
  2. Создается проект, который называется citysearch_project .
  3. Настраивается внутренняя база данных через migrate , а потом запускается локальный веб-сервер с помощью команды runserver .

Руководство по созданию поиска на сайте в Django

После того, как вы выполните приведенный выше код и перейдете на страницу http://127.0.0.1:8000/ , то увидите приветствие Django, подтверждающее, что все настройки выполнены правильно. Локальный сервер не выражает все моменты реальной работы сайта на сервере. Ознакомиться со списком хостингов можно на сайте http://hostinghub.ru/top/vds/ .

Создаем приложение Cities в Django

Теперь давайте создадим одну программу, которая называется cities , в которой будет храниться список названий городов.

Мы специально откажемся от использования сложных команд и комбинаций.

Для начала необходимо воспользоваться комбинацией клавиш Ctrl + C, чтобы остановить локальный сервер. Затем воспользуйтесь командой startapp , с помощью которой будет создаваться наше новое приложение.

$ python manage.py startapp cities

После этого нужно обнровить INSTALLED_APPS внутри нашего файла settings.py . Таким образом вы сообщаете Django о новом приложении.

# citysearch_project/settings.py INSTALLED_APPS = [ . 'cities.apps.CitiesConfig', # new ]

Теперь перейдем к моделям. Мы нашей единственной модели дадим название City. В ней будет два поля: name и state . Поскольку админка рассматриваемого нами фреймворка будет по умолчанию изменять имя приложения во множественном числе на Citys , то также необходимо выполнить настройку verbose_name_plural . И наконец, настроим __str__ для того, чтобы показывать имя города.

# cities/models.py from django.db import models class City(models.Model): name = models.CharField(max_length=255) state = models.CharField(max_length=255) class Meta: verbose_name_plural = "cities" def __str__(self): return self.name

Прекрасно, теперь у нас все настроено. Мы можем создать файл миграции для этого изменения, а потом воспользоваться migrate , чтобы добавить его в нашу базу данных.

$ python manage.py makemigrations cities $ python manage.py migrate

Существует несколько вариантов заполнения базы данных. Правда, самый простой способ — через админку. Для начала необходимо создать учетную запись суперпользователя, через которую становится возможным вход в админку.

$ python manage.py createsuperuser

Теперь нам необходимо обновить cities/admin.py , чтобы отобразить наше приложение внутри админки.

# cities/admin.py from django.contrib import admin from .models import City class CityAdmin(admin.ModelAdmin): list_display = ("name", "state",) admin.site.register(City, CityAdmin)

Руководство по созданию поиска на сайте в Django

Далее необходимо осуществить повторный запуск сервера, воспользоавшись командой python manage.py runserver , после чего откройте админку по адресу, указанному на скриншоте. И, в конце концов, зайдите в аккаунт суперпользователя.

Руководство по созданию поиска на сайте в Django

Нажмите на раздел cities и добавьте несколько записей. Здесь видно четыре примера.

Домашняя страница и страница выдачи поиска Django

Мы имеем заполненную базу данных. Тем не менее, все еще есть ряд шагов, которые необходимо выполнить перед тем, как станет возможно ее отображение на сайте. В конечном итоге, нам необходимо иметь лишь домашнюю страницу и страницу выдачи поиска.

Каждой странице нужен надлежащий вид, url, шаблон. Порядок, в котором будет создаваться каждая страница, в нашем случае не имеет особого значения. Главное, чтобы на сайте присутствовали все необходимые компоненты.

В целом, рекомендуем начинать с URL, а потом добавить views. А в конце концов, создать шаблоны. Это – оптимальный вариант действий.

Сперва необходимо добавить путь URL для нашего приложения, это можно сделать, импортировав include и настроив путь к нему.

# citysearch_project/urls.py from django.contrib import admin from django.urls import path, include # new urlpatterns = [ path('admin/', admin.site.urls), path('', include('cities.urls')), # new ]

Затем, нам нужен urls.py внутри приложения cities . Правда, Django не предусматривает возможности создавать такой для нас по команде startapp . Но нет поводов волноваться, поскольку всегда его можно создать в командной строке. Для начала воспользуемся комбинацией клавиш Ctrl + C, чтобы остановить сервер (если он работает состоянием на этот момент у вас).

$ touch cities/urls.py

Внутри этого файла необходимо импортировать еще не созданные представления для каждой HomePageView, SearchResultsView и указать путь к каждому из них. Учтите то, что нами указывается опциональное название URL для каждого из них.

Вот, как будет все приблизительно выглядеть.

# cities/urls.py from django.urls import path from .views import HomePageView, SearchResultsView urlpatterns = [ path('search/', SearchResultsView.as_view(), name='search_results'), path('', HomePageView.as_view(), name='home'), ]

В третьих, нам надо выполнить настройку наших двух представлений ( views) . Домашняя страница будет простым шаблоном с итоговой поисковой строкой. Для Django прекрасно подходит TemplateView , чтобы добиться этой задачи. Страница поисковой выдачи упорядочит требуемые результаты, что прекрасно ложится под ListView .

# cities/views.py from django.views.generic import TemplateView, ListView from .models import City class HomePageView(TemplateView): template_name = 'home.html' class SearchResultsView(ListView): model = City template_name = 'search_results.html'

На последнем этапе нам необходимо работать с нашими шаблонами. Мы можем добавить шаблоны внутри нашего приложения cities . Правда, есть и более легкий вариант действий. Если говорить более конкретно, то можно создать папку проектных шаблонов.

Итак, давайте создадим папку с шаблонами, а потом два шаблона home.html, search_results.html .

$ mkdir templates $ touch templates/home.html $ touch templates/search_results.html

Учтите и то, что нам также понадобится внести изменения в наш файл settings.py, чтобы указать Django на проектную папку с шаблонами. В разделе TEMPLATES это также можно будет найти.

# citysearch_project/settings.py TEMPLATES = [ < . 'DIRS': [os.path.join(BASE_DIR, 'templates')], # new . >]

В итоге, домашняя страница покажет лишь заголовок.

 

HomePage

Руководство по созданию поиска на сайте в Django

Если запустить веб-сервер повторно, то мы увидим домашнюю страницу.

Теперь для страницы выдачи, которая будет проходить через object_list , будет возвращено имя из контекстного объекта ListView . После этого мы будем отображать имя и состояние для каждой записи из базы данных.

Руководство по созданию поиска на сайте в Django

Все готово! Наша страница поисковой выдачи доступна на http://127.0.0.1:8000/search/ .

Формы и наборы запросов в Django

В результате, базовая реализация поиска сводится к форме, передающей пользовательский запрос. То есть, непосредственно сам поиск. А потом переходит к набору инструментов для фиксации результатов, полученных на основе ключевых слов, введенных пользователем.

Мы можем начать с какого-угодно варианта. Но давайте начнем с настройки фильтрации, а потом перейдем к форме.

Базовая фильтрация запросов в Django

В Django, QuerySet нужен для того, чтобы фильтровать выдачу из модели базы данных. На данный момент, наша модель City выводит все данные, которые в ней содержатся. Наша задача – ограничить страницу поисковой выдачи для фильтрации результатов, которые были выведены, основываясь на поисковом запросе от пользователя.

Существует несколько способов настройки набора запросов. На самом деле реально фильтровать через сам менеджер моделей. Правда, чтобы упростить действия, вы можете добавить фильтр только в одну строку. Давайте попробуем это сделать.

Здесь мы обновляем метод queryset из ListView, а фильтр добавляется таким образом, что возвращается лишь город под названием Бостон. Следовательно, она будет заменена переменной, представляющей запрос пользователя.

# cities/views.py class SearchResultsView(ListView): model = City template_name = 'search_results.html' queryset = City.objects.filter(name__icontains='Boston') # новый

Руководство по созданию поиска на сайте в Django

А теперь давайте попробуем обновить страницу поисковой выдачи для того, чтобы убедиться в том, что отображается исключительно Бостон.

Теперь можно выполнить настройку queryset путем переопределения метода get_queryset() для того, чтобы изменить список выданных городов.

# cities/views.py . class SearchResultsView(ListView): model = City template_name = 'search_results.html' def get_queryset(self): # новый return City.objects.filter(name__icontains='Boston')

Этот вариант будет более гибким.

Объекты Q в Django

Почему хорошо использовать filter() ? Потому что он позволяет связать фильтры вместе. Тем не менее, в некоторых случаях могут понадобиться более сложные запросы, такие как ИЛИ (OR). В этом случае можно воспользоваться объемами Q.

Вот пример того, как они используются.

# cities/views.py from django.db.models import Q # новый . class SearchResultsView(ListView): model = City template_name = 'search_results.html' def get_queryset(self): # новый return City.objects.filter( Q(name__icontains='Boston') | Q(state__icontains='NY') )

Руководство по созданию поиска на сайте в Django

И такой результат мы получаем после того, как страница поисковой выдачи будет обновлена.

Формы для ввода данных на сайте Django

Фактически схема работы с формами простая. Это совокупность POST и GET запросов. Собственно, один из этих методов и нужно использовать. Давайте попробуем разобраться, как это реализуется на практике.

Поисковая форма для Django-проекта

Давайте попробуем создать поисковую форму для Django-сайта. Вот так она будет выглядеть в конечном итоге. Всего пара строк кода, не так ли?

 

HomePage

" method="get">

Для формы, параметр action определяет, куда пользователь должен быть направлен после того, как кнопка поиска будет нажата. Используется адрес страницы поисковой выдачи. После этого определяется использование GET в качестве запроса, через который все это реализуется.

После всего этого необходимо взять пользовательский поисковый запрос и передать его дальше в логику приложения.

# cities/views.py . class SearchResultsView(ListView): model = City template_name = 'search_results.html' def get_queryset(self): # новый query = self.request.GET.get('q') object_list = City.objects.filter( Q(name__icontains=query) | Q(state__icontains=query) ) return object_list

Все, результат есть. Отлично.

Теперь давайте посмотрим на реальном примере, как это все будет работать. Давайте попробуем ввести в строку поиска запрос «San Diego» и посмотрим на то, что получилось в итоге. Руководство по созданию поиска на сайте в Django Руководство по созданию поиска на сайте в Django

Что дальше?

На этом данный урок подошел к концу. Конечно, это только основы поиска в Django. Все намного сложнее, на самом деле. Возможно, вы желаете добавить кнопку в поисковую форму, которая также может нажиматься, как и Enter? Или желаете добавить какую-нибудь валидацию формы?

Кроме фильтрации с использованием AND, OR, имеются и другие факторы. Например, необходимо учитывать релевантность, если поисковик должен быть хотя бы немного приближен к знаменитому Google.

Руководство по созданию поиска на сайте в Django

Поиск на сайте в Django

В данном руководстве мы освоим базовый поиск по сайту Django и затронем способы улучшить его с более продвинутыми возможностями.

Полный исходный код можно найти на GitHub.

Для начала, давайте создадим новый проект Django (перейдите сюда, если нужна помощь). В вашей командной строке, введите следующие команды для установки последней версии при помощи Pipenv, создайте проект под названием citysearch_project , настройте внутреннюю базу данных через migrate и запустите локальный веб сервер при помощи runserver .

$ pipenv install django == 2.2.1
$ pipenv shell
$ django — admin startproject citysearch _ project .
$ python manage .py migrate
$ python manage .py runserver

Если вы перейдете на http://127.0.0.1:8000/ , вы увидите приветствие Django, которое подтверждает, что все настроено правильно. Локальный сервер не выражает все моменты реальной работы сайта на сервере, можете ознакомиться со списком хостингов https://hostinghub.ru/top/vds на которых вы можете запустить полноценный сайт на Python.

Django Search

Создаем приложение Cities в Django

Теперь мы создадим одно приложение под названием cities для хранения списка названий городов. Мы осознанно не будем выходить за рамки простых основ. Остановите локальный сервер при помощи Ctrl+C и используйте команду startapp для создания нашего нового приложения.

$ python manage .py startapp cities

Затем обновите INSTALLED_APPS внутри нашего файла settings.py , чтобы сообщить Django о новом приложении.

# citysearch_project/settings.py
INSTALLED_APPS = [
‘cities.apps.CitiesConfig’ , # new

Теперь перейдем к моделям. Мы назовем нашу единственную модель City . В ней будет два поля: name и state . Так как админка Django по умолчанию будет менять имя приложения во множественном числе на Citys , мы также настроим verbose_name_plural . И наконец настроим __str__ для отображения названия города.

# cities/models.py
from django . db import models
class City ( models . Model ) :
name = models . CharField ( max_length = 255 )
state = models . CharField ( max_length = 255 )
class Meta :
verbose_name_plural = «cities»
def __str__ ( self ) :
return self . name

Отлично, все настроено. Мы можем создать файл миграции для этого изменения, затем добавить его в нашу базу данных через migrate .

$ python manage . py makemigrations cities
$ python manage . py migrate

Есть несколько способов наполнить базу данных, но самый простой, на мой взгляд, это через admin. Создайте аккаунт суперпользователя, чтобы мы смогли зайти в админку.

$ python manage . py createsuperuser

Теперь нам нужно обновить cities/admin.py для отображения нашего приложения внутри админки.

# cities/admin.py
from django . contrib import admin
from . models import City
class CityAdmin ( admin . ModelAdmin ) :
list_display = ( «name» , «state» , )
admin . site . register ( City , CityAdmin )

Еще раз запустите сервер при помощи python manage.py runserver и направьтесь в админку по http://127.0.0.1:8000/admin , затем зайдите в свой аккаунт суперпользователя.

Django панель администратора

Нажмите на раздел cities и добавьте несколько записей. Здесь видно четыре моих примера.

Админка Django примеры

Домашняя страница и страница выдачи поиска Django

У нас есть заполненная база данных, однако все еще есть несколько шагов, которые нужно выполнить, перед тем как она может быть отображена на нашем сайте Django. В конце концов, нам нужна только домашняя страница и страница выдачи поиска. Каждой странице нужен надлежащий вид, url и шаблон. Порядок, в котором мы их будем создавать не принципиальный. Все должно быть на сайте для правильной работы.

В целом, я предпочитаю начинать с URL-ов, добавить views , и в конце создать шаблоны, чем мы и займемся.

Сначала нам нужно добавить путь URL для нашего приложения, это можно сделать, импортировав include и настроив путь к нему.

# citysearch_project/urls.py
from django . contrib import admin
from django . urls import path , include # new
urlpatterns = [
path ( ‘admin/’ , admin . site . urls ) ,
path ( » , include ( ‘cities.urls’ ) ) , # new

Далее, нам нужнен файл urls.py внутри приложения cities , однако Django не создает такой для нас по команде startapp . Не нужно беспокоиться, мы можем создать его в командной строке. Останавливаем сервер при помощи Ctrl+C , если он еще работает.

$ touch cities / urls .py

Внутри этого файла мы импортируем еще не созданные представления ( views ) для каждой HomePageView и SearchResultsView , и указать путь к каждому из них. Обратите внимание на то, что мы указываем опциональное название URL для каждого из них.

Вот так это будет выглядеть:

# cities/urls.py
from django . urls import path
from . views import HomePageView , SearchResultsView
urlpatterns = [
path ( ‘search/’ , SearchResultsView . as_view ( ) , name = ‘search_results’ ) ,
path ( » , HomePageView . as_view ( ) , name = ‘home’ ) ,

В третьих, нам нужно настроить наши два представления ( views ). Домашняя страница будет простым шаблоном с итоговой поисковой строкой. Для Django отлично подойдет TemplateView для этой цели. Страница поисковой выдачи упорядочит необходимые результаты, что хорошо ложится под ListView .

# cities/views.py
from django . views . generic import TemplateView , ListView
from . models import City
class HomePageView ( TemplateView ) :
template_name = ‘home.html’
class SearchResultsView ( ListView ) :
model = City
template_name = ‘search_results.html’

Последний шаг — наши шаблоны. Мы можем добавить шаблоны внутри нашего приложения cities , однако я нашел более простой подход, а именно — создание папку проектных шаблонов.

Создайте папку с шаблонами и затем оба шаблона: home.html и search_results.html .

$ mkdir templates
$ touch templates / home .html
$ touch templates / search_results .html

Обратите внимание на то, что нам также нужно обновить наш settings.py , чтобы указать Django на проектную папку с шаблонами. Это вы можете найти в разделе TEMPLATES .

# citysearch_project/settings.py
‘DIRS’ : [ os.path . join ( BASE_DIR , ‘templates’ ) ] , # new

Домашная страница выведет только заголовок.

HomePage

Запустите веб сервер еще раз при помощи python manage.py runserver . Теперь мы можем увидеть домашнюю страницу на http://127.0.0.1:8000/ .

Страница Django

Теперь, для страницы поисковой выдачи, которая будет выполнять цикл на object_list , вернется имя от контекстного объекта ListView . Затем мы выведем name и state для каждой записи из базы данных.

Search Results

Все готово! Наша страница поисковой выдачи доступна на http://127.0.0.1:8000/search/ .

Django результаты поиска

Формы и наборы запросов в Django

В конечном итоге базовая реализация поиска сводится к форме, которая передает пользовательский запрос — сам фактический поиск — и затем к набору запросов, который будет фильтровать результаты на основе этого запроса.

Мы можем начать с любого из них, но мы начнем с настройки фильтрации, после чего перейдем к форме.

Базовая фильтрация запросов в Django

В Django, QuerySet используется для фильтрации выдачи из модели базы данных. В данный момент, наша модель City выводит все свое содержимое. В итоге нам нужно ограничить страницу поисковой выдачи для фильтрации выведенных результатов, на основании поискового запроса от пользователя.

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

Здесь мы обновляем метод queryset из ListView и добавляем фильтр, так что возвращается только город под названием Бостон . В итоге, мы заменим это переменной, которая представляет пользовательский поисковый запрос.

# cities/views.py
class SearchResultsView ( ListView ) :
model = City
template_name = ‘search_results.html’
queryset = City . objects . filter ( name__icontains = ‘Boston’ ) # новый

Обновите страницу поисковой выдачи и вы увидите, что отображается только Бостон .

Django поисковая выдача

Также можно настроить queryset , переопределив метод get_queryset() , для изменения списка выданных городов. Явного преимущества в этом для нас нет, но этот подход мне кажется более гибким, чем просто указать атрибуты набора запросов.

# cities/views.py
class SearchResultsView ( ListView ) :
model = City
template_name = ‘search_results.html’
def get_queryset ( self ) : # новый
return City . objects . filter ( name__icontains = ‘Boston’ )

Большую часть времени, встроенных методов filter() , all() , get() , или exclude() из QuerySet будет достаточно. Однако есть очень надежный и детализированный API QuerySet.

Объекты Q в Django

Использование filter() — эффективно, с ним даже можно связать фильтры вместе. Однако, вам могут понадобиться более сложные запросы, такие как ИЛИ (OR) . В таких случаях приходит время объектов Q.

Вот пример того, где мы настраиваем фильтр на поиск результата, который совпадает с названием города Бостон , или название штата, которое содержит аббревиатуру NY . Это также просто, как импорт Q вверху файла, и затем слегка поменять наш существующий запрос

# cities/views.py
from django . db . models import Q # новый
class SearchResultsView ( ListView ) :
model = City
template_name = ‘search_results.html’
def get_queryset ( self ) : # новый
return City . objects . filter (
Q ( name__icontains = ‘Boston’ ) | Q ( state__icontains = ‘NY’ )

Обновите вашу страницу поисковой выдачи, чтобы увидеть результат.

Фильтрация Q в Django

Теперь, вернемся к нашей HTML-форме поиска для замены текущих прописанных значений переменными поискового запроса.

Формы для ввода данных на сайте в Django

По сути, веб формы — это просто: они берут ввод пользователя и направляют его в URL либо через метод GET , либо через POST . Однако на практике, это фундаментальное поведение веба может быть монструозно сложным.

Первая проблема — это отправка данных формы: куда на самом деле идут данные, и как мы их будет обрабатывать? Не говоря уже о множественных проблемах с безопасностью, когда вы разрешаете пользователям отправлять данные на веб-сайт.

Существует только два варианта того, как отправлять форму: либо через HTTP метод GET , либо через POST .

POST связывает данные формы, кодирует их для передачи, отправляет их на сервер и затем получает ответ. Любой запрос, который меняет состояние базы данных (создает, редактирует, или удаляет данные) — должен использовать POST .

GET связывает данные формы в строку, которая вносится в URL. GET должен быть использован для такого запроса, который не влияет на состояние приложения, например — поиск, где ничего внутри базы данных не меняется. Мы просто выполняем отфильтрованный просмотр списка.

Если вы взгляните на URL после поиска в гугле, вы увидите свой поисковый запрос в самом URL страницы результатов поиска ?q= .

Для дополнительной информации, Mozilla предоставляет подробные руководства как для отправки данных из формы, так и валидации форм данных, с которыми стоит ознакомиться, если вы не владеете основами.

Поисковая форма для сайта на Django

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *