Django select2使用Elasticsearch链接下拉列表

时间:2019-09-24 08:01:47

标签: django elasticsearch jquery-select2 django-select2

我想使用Django将带有Elasticsearch的链式下拉列表作为后端。我在ES中有两个索引,我将使用索引A来链接下拉列表,并使用索引B来进行搜索,其中使用给定的约束使用公共字段在索引A中选择给定的约束。

就像下面在选择Lv0之后的位置一样,将根据Lv0中选择的值来填充Lv1。单击提交表单后(希望这可以将所选变量传递给索引B进行查询),仅可以对所选Lv0和Lv1中的索引B进行查询。

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索引编制? (如果我错了,请纠正我)

我还使用jquery和ajax研究select2。但是我找不到用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>

0 个答案:

没有答案