Evgenii Legotckoi
Evgenii Legotckoi16. Januar 2018 02:19

Django - Tutorial 032. Erweiterte Suchoptionen

Die Website verfügt über eine Funktion, mit der Sie im Forum eine Frage stellen können, die den Artikel auf der Website angibt, auf den sich diese Frage auf die eine oder andere Weise bezieht. Dies geschieht dank Fremdschlüsseln vom Thema im Forum der Site zu den Artikeln. In diesem Fall ist möglicherweise kein Fremdschlüssel vorhanden.

article = models.ForeignKey(Article, verbose_name=_("Статья"), null=True, blank=True)

So können Sie am Ende des Artikels sehen, wie viele Fragen im Forum zu diesem Artikel gestellt wurden. Auf diese Weise können Sie die Verlinkung der Site-Seiten verbessern und den Benutzern außerdem ermöglichen, ähnliche Fragen zu dem Artikel zu finden, den sie gerade studieren.

Die Hauptfrage für mich war, wie man eine Liste von Themen im Forum implementiert, um die Site nicht mit zusätzlichen Seiten zu überladen, die die Navigation erschweren würden. Die Lösung stellte sich als recht einfach heraus: Fügen Sie die Möglichkeit hinzu, das Forum mit zusätzlichen erweiterten Suchschlüsseln zu durchsuchen. Nämlich der Schlüssel article , der die id des Artikels definieren würde, nach dem alle Themen im Forum gefiltert werden, die einen Fremdschlüssel zu einem Artikel mit der angegebenen id enthalten.

Dieser Ansatz ermöglichte es, die Hauptseite des Forums minimal zu ändern, die Funktionalität des Forums um eine zusätzliche Suche zu erweitern und das Hinzufügen einer neuen Ansicht und Vorlage für neue Seiten auszuschließen.


Schablone

Ich werde nicht auf das Layout selbst eingehen, es ist nicht so wichtig, ich werde nur das Layout für das Suchformular zeigen.

<form class="input-group" method="get">
    <input name="q" type="text" class="form-control" placeholder="Поиск по форуму" value="{{ q }}">
    <span class="input-group-btn">
        <button type="submit" class="btn btn-default">Поиск</button>
    </span>
</form>

{% include 'forum/partials/index_topics_list.html' %}

Für das Layout wird bootstrap 3 verwendet. Die Forum-Hauptseitenvorlage enthält eine Vorlage zum Anzeigen einer Liste von Forumsthemen sowie ein Formular zum Eingeben einer Suchanfrage. In diesem Fall wird die Methode get für die Anfrage verwendet.

Die Abfrage kann ein normales Wort oder eine Phrase oder ein Schlüssel:Wert -Paar sein. In diesem Fall sieht das Paar so aus Artikel:95.

q ist jeweils der Text der Suchanfrage.

Bei dieser Lösung wird nur ein Schlüssel-Wert-Paar verarbeitet. Das reicht für meine Zwecke.

urls.py

Der Pfadmanager ist nichts Besonderes.

# -*- coding: utf-8 -*-

from django.conf.urls import url

from . import views

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

views.py

Die Suche nach erweitertem Schlüssel erfolgt über eine Ausnahme, dh wenn es nicht möglich ist, ein Schlüssel / Wert-Paar auszuwählen, versuchen wir, eine reguläre Suche zu verwenden.

'''
Advanced search keys
'''
ARTICLE = 'article'

class IndexView(View):
    template_name = 'forum/index.html'

    def get(self, request):
        q = self.request.GET.get('q')
        if q:
            try:
                # Попытаемся разбить поисковый запрос на пару ключ/значение
                key, value = q.split(':')
                # Если удалось и нет исключения, то проверяем, является ли ключ исправным, а значение является ли числом
                if key == ARTICLE and value.isdigit():
                    # если да, то то фильтруем темы по внешнему ключу статей
                    object_list = Topic.objects.filter(article__pk=value).order_by('-lastmod')
                else:
                    # в противном случае выкидываем исключение
                    raise ValueError
            except ValueError:
                # При исключении делаем обычный поиск по заголовку тем, содержанию тем и содержанию сообщений в темах форума
                object_list = Topic.objects.filter(
                    Q(title__icontains=q) |
                    Q(content__icontains=q) |
                    Q(forumpost__content__icontains=q)
                ).distinct().order_by('-lastmod')
        else:
            # если поисковый запрос отсутствует, то выполняем обычную выборку статей
            object_list = Topic.objects.all().order_by('-lastmod')

        return render(
            request=request,
            template_name=self.template_name,
            context={
                'q': q or '',
                'object_list': get_paginated_page(request, object_list, 40),
                'last_question': request.get_full_path().replace(request.path, '') # url для пагинации с учётом вопроса
            }
        )

Über die Funktion get_paginated_page können Sie im Artikel über Neuladen eines Teils des Seiteninhalts nachlesen.

Dieser Weg kann als Link zu Forenfragen im Zusammenhang mit dem Artikel implementiert werden,

<a href="{% url 'forum:index' %}?q=article:{{ article.pk }}">

und erweiterte Suchschlüssel im Stil bekannter Suchmaschinen.

Für Django empfehle ich Timeweb-Hoster 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!

AK
  • 4. März 2022 05:46

Добрый день!
Помогите советом: есть таблица (over 150.000 записей) по которой хотелось бы вести поиск по трем полям не усложняя жизнь пользователю вводом форматированных запросов.
Поле поиска одно, в котором пользователь может ввести как данные из одного поля, так и их сочетание.
Как-то это реализуемо или я много хочу?)

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов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> в заголовочном файле не работает валидатор.
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