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