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

Пікірлер

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

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

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

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

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

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

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
i
innorwallҚар. 13, 2024, 8:09 Т.Қ.
C++ файлдарының ішінде CMakeLists.txt ішінде жарияланған айнымалы мәндерді пайдалану where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
i
innorwallҚар. 11, 2024, 10:12 Т.Қ.
Django - Оқулық 055. Автоматты толтыру өрісі функциясын қалай жазу керек Freckles because of several brand names retin a, atralin buy generic priligy
i
innorwallҚар. 11, 2024, 6:23 Т.Қ.
QML - Сабақ 035. C++ қолданбай QML тілінде сандарды пайдалану priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
i
innorwallҚар. 11, 2024, 3:50 Т.Қ.
Qt/C++ - 052-сабақ. Qt аудио ойнатқышын AIMP стилінде теңшеу It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
i
innorwallҚар. 11, 2024, 2:19 Т.Қ.
Үйінді сұрыптау алгоритмі The role of raloxifene in preventing breast cancer priligy precio
Енді форумда талқылаңыз
i
innorwallҚар. 13, 2024, 6:52 Т.Қ.
добавить qlineseries в функции PMID 35774217 Free PMC article priligy cvs
i
innorwallҚар. 11, 2024, 10:55 Т.Ж.
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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