我想使用Django将带有Elasticsearch的链式下拉列表作为后端。我在ES中有两个索引,我将使用索引A来链接下拉列表,并使用索引B来进行搜索,其中使用给定的约束使用公共字段在索引A中选择给定的约束。
就像下面在选择Lv0之后的位置一样,将根据Lv0中选择的值来填充Lv1。单击提交表单后(希望这可以将所选变量传递给索引B进行查询),仅可以对所选Lv0和Lv1中的索引B进行查询。
许多天前,我已经成功地在索引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>