Evgenii Legotckoi
Evgenii Legotckoi4. Oktober 2016 12:09

Django - Tutorial 012. Site-Suche mit Pagintaion basierend auf Django

Um eine Suche auf einer Website zu organisieren, die auf Django basiert und die PostgreSQL Datenbank verwendet, können Sie das Modul zum Durchsuchen dieser Datenbank verwenden, das mit Django geliefert wird. Außerdem bietet diese Suche eine Volltextsuche, die für eine kleine Ressource ausreichend ist.

Aber damit die Suchanfragen eher wie die Hauptseite aussehen, werden wir die Möglichkeit hinzufügen, Suchergebnisseiten zu paginieren, und die Ergebnisse werden 10 Stück pro Seite angezeigt. Und dafür werden wir auch das django \ _bootstrap3. -Modul verwenden

Als Ergebnis haben wir folgenden Aktionsplan:

  1. Fügen Sie eine Anwendung zum Organisieren der Suche hinzu;
  2. Such-URL hinzufügen;
  3. Fügen Sie ein Suchformular hinzu;
  4. Beschreiben der Suchseitenvorlage.
  5. Beschreiben Sie die Ansicht zur Verarbeitung der Suchergebnisse;

Hinzufügen einer Suchanwendung

Ein Standardpunkt zum Erstellen einer neuen Anwendung in Ihrem Django-Projekt ist:

python manage.db startapp search

Als Ergebnis erhalten wir eine neue Bewerbung mit folgendem Aufbau:

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

Lassen Sie uns die Datei settings.py etwas korrigieren. Fügen wir die Konfiguration unserer Anwendung hinzu, die standardmäßig erstellt wird, wir verwenden auch zwei Module:

  1. Um mit Postgres zu arbeiten
  2. django_bootstrap3
INSTALLED_APPS = [
    ...
    'search.apps.SearchConfig',
    'django.contrib.postgres',
    'bootstrap3',
    ...
]

Such-URLs hinzufügen

Zuerst müssen Sie eine URL-Vorlage hinzufügen, die eine Anfrage an die search. App sendet.

from django.conf.urls import url, include

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

Zweitens müssen Sie der Suchanwendung selbst eine urls.py-Datei mit dem folgenden Inhalt hinzufügen, um die Anforderung einzurichten, die an die Ansicht gesendet werden soll.

from django.conf.urls import url

from . import views

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

Suchformular

Das Suchformular wurde der Basisvorlage base.html in der Anwendung home hinzugefügt, die von der Suchseitenvorlage übernommen wird.

Ich gebe die Version, die auf dieser Site verwendet wird, mit 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>

Lassen Sie uns die wichtigsten Punkte herausfinden:

  1. Das Aktionsfeld enthält die Adresse, an die die Anfrage gesendet wird;
  2. Die GET-Methode wird verwendet, da der Benutzer das Suchergebnis teilen möchte;
    3.bootstrap \ _icon lädt Icons aus dem glyphicons Set.

Suchseitenvorlage

Um die Ergebnisse anzuzeigen, habe ich die Organisation des Erscheinungsbilds wie auf der Hauptseite der Site verwendet. Weitere Informationen hierzu finden Sie im Artikel Einführung der Paginierung .

Der wichtigste Unterschied zur Hauptseite besteht jedoch darin, dass es irgendwie notwendig ist, das Umblättern beim Paginieren und das Speichern der Anfrage zu kombinieren. Dazu können Sie in bootstrap \ _pagination eine benutzerdefinierte URL ersetzen. Nämlich url = last \ _question, die die letzte Anfrage enthält, die im Suchformular eingestellt wurde. Die Seitennummer wird automatisch an diese URL angehängt.

{% 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 %}

Suchansicht

Ein wichtiger Punkt hierbei ist, dass Sie aus der Anfrage eine URL erstellen müssen, die die letzte Anfrage enthält und in die Paginierungsschaltflächen eingefügt wird. Andernfalls ist die Suche fehlerhaft, wenn Sie auf die Paginierungsschaltfläche klicken, und Sie erhalten höchstwahrscheinlich Fehler 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)

Für Django empfehle ich Timeweb Hosting VDS Server .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken