Evgenii Legotckoi
Evgenii LegotckoiҚаң. 16, 2018, 2:19 Т.Ж.

Джанго - Сабақ 032. Кеңейтілген іздеу опциялары

Мазмұны

Сайтта форумда сұрақ қоюға мүмкіндік беретін мүмкіндік бар, ол осы сұрақтың қандай да бір түрде қатысты болатын сайттағы мақаланы көрсетеді. Бұл сайт форумындағы тақырыптан мақалаларға дейінгі шетелдік кілттердің арқасында жасалады. Бұл жағдайда сыртқы кілт болмауы мүмкін.

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

Осылайша, мақаланың соңында сіз осы мақалаға қатысты форумда қанша сұрақ қойылғанын көре аласыз. Бұл сайт беттерін байланыстыруды жақсартады, сонымен қатар пайдаланушыларға өздері зерттеп жатқан мақалаға қатысты ұқсас сұрақтарды табуға мүмкіндік береді.

Мен үшін басты сұрақ - шарлауды қиындататын қосымша беттермен сайтты шамадан тыс жүктемеу үшін форумда тақырыптар тізімін қалай енгізу керек еді. Шешім өте қарапайым болып шықты: қосымша кеңейтілген іздеу кілттерімен форумды іздеу мүмкіндігін қосыңыз. Атап айтқанда, мақаланың идентификаторын анықтайтын мақала кілті, ол арқылы форумда берілген id бар мақаланың сыртқы кілті бар барлық тақырыптарды сүзуге болады.

Бұл тәсіл форумның негізгі бетін ең аз өзгертуге, қосымша іздеу арқылы форумның функционалдығын кеңейтуге және жаңа беттерге жаңа көрініс пен шаблонды қосуды болдырмауға мүмкіндік берді.


Үлгі

Мен макеттің өзін зерттемеймін, бұл соншалықты маңызды емес, мен тек іздеу пішінінің макетін көрсетемін.

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

Орналасу үшін bootstrap 3 пайдаланылады. Форумның негізгі бетінің үлгісі форум тақырыптарының тізімін көрсетуге арналған үлгіні, сондай-ақ іздеу сұрауын енгізуге арналған пішінді қамтиды. Бұл жағдайда сұрау үшін get әдісі қолданылады.

Сұрау тұрақты сөз немесе сөз тіркесі немесе кілт:мән жұбы болуы мүмкін. Бұл жағдайда жұп келесідей болады мақала:95.

q сәйкесінше іздеу сұрауының мәтіні.

Бұл шешімде тек бір кілт пен мән жұбы өңделеді. Бұл менің мақсаттарым үшін жеткілікті.

urls.py

Жол менеджерінде ерекше ештеңе жоқ.

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

from django.conf.urls import url

from . import views

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

рет көру.py

Кеңейтілген кілт бойынша іздеу ерекше жағдай арқылы жүзеге асырылады, яғни кілт/мән жұбын таңдау мүмкін болмаса, біз әдеттегі іздеуді қолдануға тырысамыз.

'''
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 для пагинации с учётом вопроса
            }
        )

get_paginated_page функциясы туралы бет мазмұнының бір бөлігін қайта жүктеу туралы мақаладан оқи аласыз.

Бұл жолды мақалаға қатысты форум сұрақтарына сілтеме ретінде іске асыруға болады,

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

және белгілі іздеу жүйелерінің стиліндегі кеңейтілген іздеу кілттері.

Django үшін Timeweb хостының VDS-сервері ұсынамын.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

AK
  • Наурыз 4, 2022, 5:46 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз