Django select2 цепочка выпадающего списка с упругим поиском - PullRequest
0 голосов
/ 24 сентября 2019

Я хотел бы иметь выпадающий список с эластичным поиском в качестве бэк-энда с использованием Django.У меня есть два индекса в ES, и я буду использовать индекс A для связанного раскрывающегося списка и индекс B для поиска заданных ограничений, выбранных в индексе A с использованием общих полей.

Как показано ниже, где после выбора Lv0, Lv1 будет заполняться в зависимости от значений, выбранных в Lv0.После нажатия на кнопку отправки (надеюсь, что это может передать выбранные переменные в индекс B для запроса), запрос может быть выполнен по индексу B только в выбранных Lv0 и Lv1.

enter image description here

Я успешно выполнил поиск по индексу 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>
...