Evgenii Legotckoi
Evgenii Legotckoi04 жовтня 2016 р. 12:09

Django - Підручник 012. Пошук по сайту з розбиттям сторінок на основі Django

Для організації пошуку на сайті, що базується на Django , та використовує базу даних PostgreSQL можна використовувати модуль для пошуку по цій базі даних, що поставляється з Django. Тим більше, що цей пошук забезпечує повнотекстовий пошук достатньо для невеликого ресурсу.

Але для того, щоб видача пошукових запитів була схожа на головну сторінку, додамо можливість пагінації сторінок видачі, а результати будуть виводитися по 10 штук на одній сторінці. І для цього також використовуватимемо модуль django_bootstrap3.

У результаті маємо наступний план дій:

  1. Додаємо додаток для організації пошуку;
  2. Додаємо url пошуку;
  3. Додаємо форму пошуку;
  4. Описуємо шаблон сторінки пошуку.
  5. Описуємо уявлення для обробки видачі пошуку;

Додаємо програму для пошуку

Стандартний момент створення нової програми у вашому проекті Django:

python manage.db startapp search

На виході отримаємо новий додаток із наступною структурою:

search/
    migrations/
        __init__.py
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py

Підкоригуємо трохи файл settings.py . Додамо конфігурацію нашої програми, використовується та, що створиться за замовчуванням, також скористаємося двома модулями:

  1. Для роботи з postgres
  2. django_bootstrap3
INSTALLED_APPS = [
    ...
    'search.apps.SearchConfig',
    'django.contrib.postgres',
    'bootstrap3',
    ...
]

Додаємо urls пошуку

По-перше, необхідно додати url шаблон, який надішле запит до програми search.

from django.conf.urls import url, include

urlpatterns = [
    ...
    url(r'^search/', include('search.urls')),
]

По-друге, потрібно додати urls.py файл в саму програму search з наступним вмістом, щоб налаштувати відправку запиту в представлення.

from django.conf.urls import url

from . import views

app_name = 'search'
urlpatterns = [
    url(r'^$', views.ESearchView.as_view(), name='index'),
]

Форма пошуку

Форма пошуку додана до базового шаблону base.html у додатку home , який успадковуватиметься шаблоном сторінки пошуку.

Наведу той варіант, який використовується на даному сайті за допомогою django-bootstrap3

{% load bootstrap3 %}
<form action="{% url 'search:index' %}" class="navbar-form navbar-left" method="get">
    <div class="input-group">
        <input id="search" name="q" type="text" class="form-control" placeholder="Поиск">
        <span class="input-group-btn">
            <button type="submit" class="btn btn-default">{% bootstrap_icon 'search' %}</button>
        </span>
    </div>
</form>

Розберемося у ключових моментах:

  1. У полі action вказана адреса куди надсилатиметься запит;
  2. Використовуватиметься метод GET, оскільки користувач може захотіти поділитися результатом пошуку;
  3. bootstrap_icon підвантажує іконки з набору glyphicons.

Шаблон сторінки пошуку

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

Але найголовнішою відмінністю від головної сторінки є те, що якимось чином необхідно поєднати перегортання сторінок під час пагінації та збереження запиту. Для цього можна підставляти кастомізований URL в bootstrap_pagination. А саме url=last_question, який міститиме останній запит, який був заданий у формі пошуку. До цієї URL-адреси автоматично буде додано номер сторінки.

{% extends 'home/base.html' %}
{% load bootstrap3 %}
{% block page %}
    <h1>Поиск</h1>
    {% if article_lists %}
        {% for article in article_lists %}
            <article>
                <a href="{{ article.get_absolute_url }}">
                    <h2>{{ article.article_title }}</h2>
                </a>
                {{ article.desctription|safe }}
                <p><a class="btn btn-default btn-sm" href="{{ article.get_absolute_url }}">Читать далее</a></p>
            </article>
        {% endfor %}
        {% bootstrap_pagination article_lists url=last_question %}
    {% else %}
        <p>Не найдено публикаций по вашему запросу<br>Попробуйте повторить запрос с другой формулировкой</p>
    {% endif %}
{% endblock %}

Подання пошуку

Важливим моментом є тут те, що із запиту необхідно підготувати URL, який міститиме останній запит і підставлятиметься в кнопочки пагінації. Інакше при натисканні кнопки пагінації пошук буде помилковим і швидше за все отримуватимете помилка 500 .

from django.shortcuts import render_to_response
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.views import View

from knowledge.models import Article


class ESearchView(View):
    template_name = 'search/index.html'

    def get(self, request, *args, **kwargs):
        context = {}

        question = request.GET.get('q')
        if question is not None:
            search_articles = Article.objects.filter(article_content__search=question)

            # формируем строку URL, которая будет содержать последний запрос
            # Это важно для корректной работы пагинации
            context['last_question'] = '?q=%s' % question

            current_page = Paginator(search_articles, 10)

            page = request.GET.get('page')
            try:
                context['article_lists'] = current_page.page(page)
            except PageNotAnInteger:
                context['article_lists'] = current_page.page(1)
            except EmptyPage:
                context['article_lists'] = current_page.page(current_page.num_pages)

        return render_to_response(template_name=self.template_name, context=context)

Для Django рекомендую VDS-сервера хостера Timeweb .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall11 листопада 2024 р. 22:12
Django - Урок 055. Як написати функціонал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
i
innorwall11 листопада 2024 р. 18:23
QML - Підручник 035. Використання перерахувань в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
i
innorwall11 листопада 2024 р. 15:50
Qt/C++ - Урок 052. Налаштування Qt Audio player в стилі AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
i
innorwall11 листопада 2024 р. 14:19
Алгоритм сортування купою The role of raloxifene in preventing breast cancer priligy precio
i
innorwall11 листопада 2024 р. 13:55
PyQt5 - Урок 006. Робота з QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
Тепер обговоріть на форумі
i
innorwall11 листопада 2024 р. 20:56
добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
i
innorwall11 листопада 2024 р. 10:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 04:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах