Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

active search from 3 january #90

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 26 additions & 2 deletions pythonz/apps/templates/_base.html
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,33 @@

<form class="form-inline" action="/search/" method="post" itemprop="potentialAction" itemscope itemtype="https://schema.org/SearchAction">
{% csrf_token %}
<div role="search" class="mr-2">
<div id="search" role="search" class="mr-2">
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А для чего тут id? Он где-то используется?

<meta itemprop="target" content="{% site_url %}/search/?text={search_term}"/>
<input class="form-control" autofocus type="search" aria-label="Search" name="text" placeholder="Поиск по справочнику" value="{{ search_term }}" required itemprop="query-input">
<label for="tags">
<input
id='tags'
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tags здесь точно ни при чем, лучше search.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В атрибутах используй везде двойные кавычки, чтобы не было разнобоя.

class="form-control"
autofocus type="search"
aria-label="Search"
name="text"
placeholder="Поиск по справочнику"
value="{{ search_term }}"
required itemprop="query-input"
hx-post="search/"
hx-trigger="keyup changed delay:500ms"
hx-target="#active_search_results"
hx-indicator=".htmx-indicator">
</label>
</div>
<div id="active_search_results" class="mr-2" style="position: absolute;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Стили лучше не зашивать в элементы, а прописать в css-файл. Раз у нас уже используется css-каркас Bootstrap, то можно использовать инструменты оттуда — это чаще проще и красивее, чем изобретение своих. В частности сейчас элемент с результатами выглядит малопривлекательно.

width: auto;
height: auto;
top: 40px;
z-index:999999;
background-color: whitesmoke;
display: block;
">

</div>
</form>

Expand Down
5 changes: 5 additions & 0 deletions pythonz/apps/templates/static/suggest_results.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% for item in results %}
<div>
<a href="{{ item.get_absolute_url }}">{{ item.title }}</a>
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Название может быть на столько длинное, что раздвинет блок с вариантами за края страницы.

</div>
{% endfor %}
16 changes: 16 additions & 0 deletions pythonz/apps/views/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,28 @@
from django.http import HttpResponse
from django.shortcuts import redirect
from django.shortcuts import render
from siteajax.decorators import ajax_dispatch
from siteajax.utils import AjaxResponse

from ..generics.views import HttpRequest
from ..models import Reference, ReferenceMissing, Category, Person, App
from ..utils import message_warning, search_models

def suggest(request):
search_term, results = search_models(
request.POST.get('text', ''), search_in=(
Category,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если будет много результатов, то это будет выглядеть так себе.
Тут нужно ограничить их максимальное число.
Ещё, может быть, поможет, если мы здесь исключим некоторые разделы, например, Персоны.

Person,
Reference,
App,
))
if len(results) > 5:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сначала выбрать из БД все результаты, а потом их усечь — не очень удачное идея. Лучше вовсе не выбирать из БД лишнее.

results = results[:5]
return render(request, 'static/suggest_results.html', {'results': results})

@ajax_dispatch({
'tags': suggest
})
def search(request: HttpRequest) -> HttpResponse:
"""Страница с результатами поиска по справочнику.
Если найден один результат, перенаправляет на страницу результата.
Expand Down
1 change: 1 addition & 0 deletions pythonz/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

from .apps.realms import bootstrap_realms
from .apps.views import page_not_found, permission_denied, server_error, index, search, login, telebot, user_settings
from .apps.views.search import suggest
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Этот импорт не используется и здесь не нужен.


urls_password_reset = [
path('password_reset/', PasswordResetView.as_view(), name='password_reset'),
Expand Down