- 1. Үлгі
- 2. urls.py
- 3. рет көру.py
Сайтта форумда сұрақ қоюға мүмкіндік беретін мүмкіндік бар, ол осы сұрақтың қандай да бір түрде қатысты болатын сайттағы мақаланы көрсетеді. Бұл сайт форумындағы тақырыптан мақалаларға дейінгі шетелдік кілттердің арқасында жасалады. Бұл жағдайда сыртқы кілт болмауы мүмкін.
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-сервері ұсынамын.
Добрый день!
Помогите советом: есть таблица (over 150.000 записей) по которой хотелось бы вести поиск по трем полям не усложняя жизнь пользователю вводом форматированных запросов.
Поле поиска одно, в котором пользователь может ввести как данные из одного поля, так и их сочетание.
Как-то это реализуемо или я много хочу?)