© EVILEG 2015-2018
Recommend hosting
TIMEWEB

Django - Tutorial 012. Site search with pagintaion based on Django

Поиск, Postgres, Search

For the organization of the search on the site, which is based on the Django , and uses a PostgreSQL database, you can use the module to search through the database that comes with Django. Especially because the search for full-text search provides sufficiently for a small site.

But in order to issue search queries looked more like the home page, the ability to add pagination of pages of issue, and the results will be displayed on the 10 pieces on the same page. And for that, we will also use django_bootstrap3 module.

As a result, we have the following plan of action:

  1. Adding an application to search for the organization;
  2. Adding search url;
  3. Add a search box;
  4. This search page template.
  5. Describes the representation for issuing the search processing;

Adding to the search application

Standard step to create a new application in your project Django:

python manage.db startapp search

At the output we get a new application with the following structure:

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

Will correct a little bit settings.py file. We add our application configuration, use the one that is created by default, and use the two modules:

  1. For work with postgres
  2. django_bootstrap3
INSTALLED_APPS = [
    ...
    'search.apps.SearchConfig',
    'django.contrib.postgres',
    'bootstrap3',
    ...
]

Addin urls for search

First, you should add the url pattern that will send a request to the search application.

from django.conf.urls import url, include

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

Secondly, you should to add urls.py file to search the app itself with the following content to adjust the query sent to the view.

from django.conf.urls import url

from . import views

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

Search form

Search form is added to the base base.html pattern in home application, which will inherit the template search page.

Here is the version that is used on this site using 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>

We will understand in the key points:

  1. The action field indicates the address where the request is sent;
  2. It will use the GET method because the user may want to share the search result;
  3. bootstrap_icon loads of icons set glyphicons.

Search page template

For the issuance of the results of the organization, I used the appearance of the same, as well as on the home page. Read more about this you can read in the article about the implementing of pagination .

But the most important difference from the home page is that somehow it is necessary to combine flipping pages with pagination and save the query. To do this, you can substitute a customized URL into bootstrap_pagination . Namely url=last_question , which will contain the last query that was specified in the search box. By this URL will be automatically added to the page number.

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

Search view

The important point here is that the query should be prepared URL, which will contain the last request, and substituted in the paging buttons. Otherwise, when you click the search button, pagination is erroneous and likely will receive 500 error .

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)

            # forming a URL string that will contain the last request. 
            # This is important for correct operation of pagination
            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)

For Django I recommend VDS-server of Timeweb hoster .

Comment

Comment

Only authorized users can write comments.
Sign in or Register, Please
Oct. 19, 2018, 8:05 a.m.
Василий Ильченко

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating scores-1
Oct. 18, 2018, 4:14 p.m.
druidx

C++ - Test 002. Constants

  • Result:25points,
  • Rating scores-10
Oct. 18, 2018, 3:58 p.m.
druidx

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating scores4
Recent comments
Oct. 19, 2018, 7:59 a.m.
Евгений Легоцкой

Python 3 - Tutorial 001. Introduce

Добрый день! Вот это линуксовая директива #!/usr/bin/python3 Указывает, где находится python пакет в системе. А вы видимо под windows разрабатываете. Попробуйте просто у...
Oct. 19, 2018, 7:54 a.m.
Abdurashid Parpieff

Python 3 - Tutorial 001. Introduce

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> #!/usr/bi...
Oct. 18, 2018, 8:31 a.m.
Евгений Легоцкой

Qt/C++ - Lesson 006. QSqlQueryModel – Tables in Qt with SQL-query

Как-то даже странно, а вы что ли в отдельный поток убрали базу данных? То есть изначально инстанс создаётся в одном потоке, а все QSqlQuery в другом потоке? Они должны находиться в одном поток...
Oct. 17, 2018, 8:43 a.m.
pasagir

Qt/C++ - Lesson 006. QSqlQueryModel – Tables in Qt with SQL-query

Не получается bool DataBase::insertDataIntoDB(QVariantList data){ QSqlQuery query(db); QString str; qDebug()<<"InsertInsertInsertInsertInsert"<<QThread::curre...
Oct. 17, 2018, 7:09 a.m.
Евгений Легоцкой

Qt/C++ - Lesson 006. QSqlQueryModel – Tables in Qt with SQL-query

Попробуйте передать инстанс базы данных в конструктор QSqlQuery QSqlQuery q(db);
Now discuss on the forum
Oct. 19, 2018, 11:52 a.m.
Евгений Легоцкой

Уведомления о лайках и дислайках

Вообще планируется система ачивок. А рейтинг есть в зачаточном состоянии. Но для системы ачивок нужно собраться с духом и выделить приличную кучку времени. Помимо того, что сами ачивки п...
Oct. 18, 2018, 12:15 p.m.
Михаиллл

Настройка Qt Creator для Android

все галочки включены.
Oct. 18, 2018, 8:16 a.m.
Allyans .

Работа с WinAPI в QT(изменение title bar)

Хорошо, я попробуй по вашей статье.
Oct. 15, 2018, 12:45 p.m.
Allyans .

QGraphicsItem change color

Хорошо)
Oct. 11, 2018, 10:13 a.m.
Arrow

Работа с WebView в QML

Нашел в чем проблема. Пишу на случай если кому-то попадется такое же счастье с WebView как и мне. Проблема как оказалась с Debug версией, так как в Release и Profile все работает (...
Join us in social networks