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:
- Fügen Sie eine Anwendung zum Organisieren der Suche hinzu;
- Such-URL hinzufügen;
- Fügen Sie ein Suchformular hinzu;
- Beschreiben der Suchseitenvorlage.
- 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:
- Um mit Postgres zu arbeiten
- 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:
- Das Aktionsfeld enthält die Adresse, an die die Anfrage gesendet wird;
-
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 .