Evgenij LegotskojJan. 16, 2018, 2:19 a.m.

Django - Tutorial 032. Advanced search options

The site has functional, thanks to which you can ask a question on the forum with an article on the site to which this question relates in one way or another. This is done through external keys from the topic on the site's forum to articles. In this case, the foreign key may not be.

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

Thus, at the end of the article you can see how many questions on the forum are given for this article. This allows you to improve the page linking of the site, and also gives users the opportunity to find similar questions about the article they are studying.

The main question for me was how to implement a list of topics on the forum so as not to overload the site with additional pages that would complicate the navigation. The solution was simple enough: add a search option on the forum with additional advanced search keys. Namely, the article key, which would define the article id , for which you want to filter out all topics on the forum that contain a foreign key for an article with this id .

This approach allowed to change the main page of the forum, to expand the functionality of the forum with an additional search and to exclude the addition of a new presentation and template for new pages.

ADS

Template

In the layout itself, I will not go into depth, it's not so important, I will show only the layout for the search form.

<form class="input-group" method="get">
    <input name="q" type="text" class="form-control" placeholder="Search Forums" value="{{ q }}">
    <span class="input-group-btn">
        <button type="submit" class="btn btn-default">Search</button>
    </span>
</form>

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

For layout, use bootstrap 3 . In the template for the main page of the forum there is a template for displaying a list of forum topics, as well as a form for entering a search query. In this case, the get method is used for the query.

A query can be a common word or phrase or a key:value . In this case, the pair will look like this: article:95 .

q is the text of the search query, respectively.

In this solution, only one key pair and value are processed. This is enough for my purposes.

urls.py

There is nothing special in the path manager.

# -*- 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

The search for the extended key is done through an exception, that is, if it is not possible to allocate a key / value pair, then we try to use a normal search.

'''
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:
                # Try to break the search query into a key / value pair
                key, value = q.split(':')
                # If it was possible and there is no exception, then we check whether the key is valid and whether the value is a number
                if key == ARTICLE and value.isdigit():
                    # If yes, then we filter the topics by external key of articles
                    object_list = Topic.objects.filter(article__pk=value).order_by('-lastmod')
                else:
                    # otherwise, throw an exception
                    raise ValueError
            except ValueError:
                # With the exception, we do a regular search for the title of the topics, the content of topics and the content of messages in forum topics
                object_list = Topic.objects.filter(
                    Q(title__icontains=q) |
                    Q(content__icontains=q) |
                    Q(forumpost__content__icontains=q)
                ).distinct().order_by('-lastmod')
        else:
            # if there is no search query, then we perform the usual selection of articles
            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 for pagination with regard to the question
            }
        )

You can read about the function get_paginated_page in the article about reloading part of the page content .

Thus, you can implement as a link to forum questions related to the article,

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

and advanced search keys in the style of well-known search engines.

For Django I recommend VDS-server of Timeweb hoster .

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

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

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
y

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
n

C++ - Test 005. Structures and Classes

  • Result:41points,
  • Rating points-8
s

C++ - Тест 003. Условия и циклы

  • Result:42points,
  • Rating points-8
Popular publications in the last 90 Days
Last comments
f
  • fryn3
  • Oct. 21, 2021, 5:24 a.m.

QML - Tutorial 038. Using the clip property to crop child objects inside Item or Rectangle

Зачем внутри OpacityMask Item, почему сразу Rectangle не вставить? И что за rect.adapt? Мое предложение: layer.enabled: true layer.effect: OpacityMask { …
s

Qt/C++ - Lesson 060. Configuring the appearance of the application in runtime

Добрый вечер, на "лету" не работает, только перезапуск
s

Qt/C++ - Lesson 060. Configuring the appearance of the application in runtime

Спасибо, завтра опробую и отпишусь по результату

Django - Tutorial 007. Adding Pagination based on django-bootstrap3

Просто список каких-нибудь объектов передавайте, который дёрнули ищ api стороннего сервера from django.core.paginator import Paginatorobjects = ['john', 'paul', 'george', 'ringo']p = Pagina…
b

PyQt5 - Tutorial 009. Using QThread with MoveToThread

Спасибо большое
Now discuss on the forum
  • grig_p
  • Oct. 21, 2021, 8:33 a.m.

Применение стилей *.qss к собственным виджетам.

Здравствуйте! Я бы хотел в виджете использовать некоторые свои свойства для его элементов. Задаю в коде виджета так: Q_PROPERTY(QColor sig1_color READ sig1Color WRITE setSig1Col…
j
  • juvf
  • Oct. 21, 2021, 7:31 a.m.

Qt Quick Virtual Keyboard

В QtCreator есть пример на QML с виртуальной клавиатурой "Qt Quick Virtual Keyboard - Basic Example". Собрал, работает. Собрал свой хеловорд свою программу состоящую из главного окна …

QScrollArea dynamically add QCheckBoxes

Всё правильно. Это просто спамер, который отправился в вечный бан.
  • Nomad
  • Oct. 15, 2021, 6:39 a.m.

Вопрос из раздела "как реализовать"

Всем привет. Есть бизнес логика которую надо реализовать на джанге, она состоит в следующем: надо реализовать функционал регистрации/авторизации компаний у которого есть свой дашборд …

Проблема с созданием файлов перевода для составного проекта

Я имею ввиду, если у вас был старые ts файлы, то написать парсер, который составил бы словарь переводов. Например. "Hello world" - "Привет мир" "Hello dev" - "Привет dev" и…
About
Services
© EVILEG 2015-2021
Recommend hosting TIMEWEB