Я хотел бы иметь выпадающий список с эластичным поиском в качестве бэк-энда с использованием Django.У меня есть два индекса в ES, и я буду использовать индекс A для связанного раскрывающегося списка и индекс B для поиска заданных ограничений, выбранных в индексе A с использованием общих полей.
Как показано ниже, где после выбора Lv0, Lv1 будет заполняться в зависимости от значений, выбранных в Lv0.После нажатия на кнопку отправки (надеюсь, что это может передать выбранные переменные в индекс B для запроса), запрос может быть выполнен по индексу B только в выбранных Lv0 и Lv1.
Я успешно выполнил поиск по индексу B много дней назад, но я застрял в добавлении индекса A и его работе с индексом B в течение недели.
Ниже я использую django-select2.
models.py
class Lv0(models.Model):
name = models.CharField(max_length=255)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
class Lv1(models.Model):
name = models.CharField(max_length=255)
lv0 = models.ForeignKey('Lv0', related_name="lv1", related_query_name="lv1",on_delete=models.CASCADE)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
forms.py
from esearch import models
from esearch.models import Lv0, Lv1
#select2 dependent searchable fields
class CateChainedSelect2WidgetForm(forms.Form):
lv0 = forms.ModelChoiceField(
queryset=Lv0.objects.all(),
label='Lv0',
widget=ModelSelect2Widget(
search_fields=['name__icontains'],
max_results=500,
#dependent_fields={'vertical': 'verticals'},
attrs={'data-minimum-input-length': 0},
)
)
lv1 = forms.ModelChoiceField(
queryset=Lv1.objects.all(),
label='Lv1',
widget=ModelSelect2Widget(
search_fields=['name__icontains'],
dependent_fields={'lv0': 'lv0'},
max_results=500,
attrs={'data-minimum-input-length': 0},
)
)
views.py
class TemplateFormView(FormView):
template_name = 'esearch/base.html'
Выше только создает два зависимых выпадающих, и я теряюсь в том, как связать его с ES в форме на основе классов.
Я изучал django-elasticsearch-dsl
, но, кажется, в основном дляES индексация?(Пожалуйста, поправьте меня, если я ошибаюсь)
Я также смотрю в select2 с jquery и ajax.Но я не могу найти пример, который заполняет раскрывающийся список ES, который может дать мне какое-либо представление о соединении.
Помимо автозаполнения с индексом A, у меня также есть проблема с включением его в мою существующую функцию поиска по индексу B.
Это то, что я использую для поиска по индексу B.
def search_index(request):
results = []
search_term = ""
if request.GET.get('query'):
search_term = request.GET['query']
results = esearch(query=search_term) //this function connects with ES
print(results)
context = {'results': results, 'count': len(results), 'search_term': search_term}
return render(request, 'esearch/index.html', context)
Я пытался преобразовать в представление на основе классов, как показано ниже, но результатов поиска больше нет.
class TemplateFormView(FormView):
template_name = 'esearch/base.html'
form_class = CateChainedSelect2WidgetForm
def search_index(self, request,*args,**kwargs):
search_term = request.GET.get('query')
results = esearch(query=search_term)
print(results)
context = {'results': results, 'count': len(results), 'search_term': search_term}
return context
base.html
<head>
{{ form.media.css }}
</head>
<body>
<form method="post" action="">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit Form"/>
</form>
<form class="form-inline">
<input
class="form-control mr-sm-2"
type="query" placeholder="query"
aria-label="query"
name = 'query'
value = "">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>