Как показать только один результат, если он не уникален в Jquery Autocomplete и Django - PullRequest
0 голосов
/ 04 мая 2019

Я только что закончил добавлять автозаполнение с помощью Jquery в мой проект Django, и, похоже, он работает нормально, показывая мне результат. Единственная проблема заключается в том, что я хочу выполнять поиск по назначению, а не по названию, и, поскольку у меня есть несколько объектов с одинаковым значением назначения, а автозаполнение настроено так, чтобы показывать 5 результатов, я получаю 5 раз один и тот же результат. Как настроить это, чтобы автозаполнение показывало только один результат, если он не уникален.

Вот ссылка на изображение проблемы:

enter image description here

Я использую этот пользовательский код Javascript для автозаполнения:

$(function () {
    'use strict';

    $('#q').autocomplete({
    serviceUrl: "http://127.0.0.1:8000/search/autocomplete/",
    minChars: 2,
    dataType: 'json',
    type: 'GET',
    onSelect: function (suggestion) {
        console.log( suggestion.value + ', data :' + suggestion.data);
    }
});

});

My Views.py Функция автозаполнения:

def autocomplete(request):
    sqs = SearchQuerySet().autocomplete(
        content_auto=request.GET.get(
            'query',
            ''))[
        :5]
    s = []
    for result in sqs:
        d = {"value": result.destination, "data": result.object.slug}
        s.append(d)
    output = {'suggestions': s}
    return JsonResponse(output)

My Models.py :

class Product(models.Model):

    destination = models.CharField(max_length=255, default='')

    title = models.CharField(max_length=255, default='')
    slug = models.SlugField(null=True, blank=True, unique=True, max_length=255, default='')
    description = models.TextField(default='')

    ptags = TaggableManager()

    image = models.ImageField(default='')
    timestamp = models.DateTimeField(auto_now=True)

    def _ptags(self):
        return [t.name for t in self.ptags.all()]

    def get_absolute_url(self):
        return reverse('product',
                       kwargs={'slug': self.slug})


    def __str__(self):
        return self.destination

И в моих URL:

from django.conf.urls import url
from django.contrib import admin
from search.views import HomeView, ProductView, FacetedSearchView, autocomplete
from .settings import MEDIA_ROOT, MEDIA_URL
from django.conf.urls.static import static

urlpatterns = [
    url(r'^$', HomeView.as_view()),
    url(r'^admin/', admin.site.urls),
    url(r'^product/(?P<slug>[\w-]+)/$', ProductView.as_view(), name='product'),
    url(r'^search/autocomplete/$', autocomplete),
    url(r'^search/', FacetedSearchView.as_view(), name='haystack_search'),

] + static(MEDIA_URL, document_root=MEDIA_ROOT)

Вот мой search_indexes.py file:

import datetime
from django.utils import timezone
from haystack import indexes
from haystack.fields import CharField

from .models import Product


class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(
        document=True, use_template=True,
        template_name='C:/Users/loicq/Desktop/Coding/UVERGO_SEARCH/venv/src/templates/search/indexes/product_text.txt')
    title = indexes.CharField(model_attr='title')
    description = indexes.EdgeNgramField(model_attr="description")
    destination = indexes.EdgeNgramField(model_attr="destination")
    image = indexes.CharField(model_attr="image")


    # Tags
    ptags = indexes.MultiValueField(model_attr='_ptags', faceted=True)

    # for auto complete
    content_auto = indexes.EdgeNgramField(model_attr='destination')

    # Spelling suggestions
    suggestions = indexes.FacetCharField()

    def get_model(self):
        return Product

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(timestamp__lte=timezone.now())

Какие-нибудь решения?

1 Ответ

0 голосов
/ 04 мая 2019

Это будет включать название продукта в автозаполнении:

for result in sqs:
    d = {
        "value": " - ".join((result.destination, result.title)),
        "data": result.object.slug,
    }

Но если вы действительно не заинтересованы в продукте, вы, вероятно, не захотите result.object.slug в data.Я предполагаю, что вы перейдете к какому-либо представлению для назначения, так что некоторый идентификатор для назначения находится тамВероятно, лучше создать отдельный индекс для пунктов назначения, но вы можете просто извлечь их следующим образом, используя понимание набора и понимание списка:

def autocomplete(request):
    sqs = SearchQuerySet().autocomplete(
        content_auto=request.GET.get('query',''))[:5]
    destinations = {result.destination for result in sqs}
    s = [{"value": dest, "data": dest} for dest in destinations]
    output = {'suggestions': s}
    return JsonResponse(output)

Я предположил, что вам не нужносохранить порядок (так как это основано на продуктах).Возможно, вы захотите получить более 5 результатов заранее, а затем обрезать их позже, чтобы иметь больше шансов на 5 различных пунктов назначения.

...