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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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