1

I've a haystack search model and whoosh search engine working well on below model:

class Business(models.Model):
    name = models.CharField(max_length=64)
    address = models.CharField(max_length=64, blank=True, null=True)
    district = models.CharField(max_length=32, blank=True, null=True)
    city = models.CharField(max_length=32, blank=True, null=True)
    phone = models.CharField(max_length=32, blank=True, null=True)
    category = models.ManyToManyField(Category)
    picture = models.ImageField(upload_to='business_image', blank=True, null=True)
    slug = models.SlugField(unique=True)
    pub_date = models.DateField(blank=True, auto_now_add=True)
    position = GeopositionField(blank=True, null=True)
    # default="35.80,51.43"

    MY_CHOICES = (('$', '$'),
                  ('$$', '$$'),
                  ('$$$', '$$$'),
                  ('$$$$', '$$$$'),)
    price = models.CharField(max_length=4, choices=MY_CHOICES, blank=True, null=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(unidecode.unidecode(self.name)) + '-' + str(self.id)
        super(Business, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.name

this is my views.py:

def search1(request, page):
    search_term = request.GET['q']
    print search_term
    form = ItemSearchForm(request.GET)

    results = form.search(request)
    results = SearchQuerySet().filter(name=search_term)
    # results = Business.objects.filter(name__icontains=search_term)


    print results

    n = 10

    # search_res = results['items']
    search_res = results



    temp = []
    for i in search_res:
        temp.append(i)
    paginator = Paginator(temp, n)
    try:
        search_result = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        search_result = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        search_result = paginator.page(paginator.num_pages)

    # Range of all pages
    page_range = paginator.page_range

    # Number of our page
    page = int(page)

    # Range of showing pages
    if page <= 5:
        pages_show = range(1, min(len(page_range), 10) + 1)
    elif page >= len(page_range) - 5:
        pages_show = range(len(page_range) - 9, len(page_range) + 1)
    else:
        pages_show = range(page - 5, page + 5)

    return render(request, 'search/search.html', {
        'search_result': search_result, 'pages_num': page_range, 'page': int(page),
        'term': search_term, 'n': n, 'pages_show': pages_show
    })

This is search_indexes.py:

class BusinessIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(model_attr='name', document=True, use_template=True)

    def get_model(self):
        return Business

This is business_text.txt

{{ object.name }}
{{object.address}}

and this is my template input:

<input type="search" id="id_q" name="q" placeholder="business" >

Now I want to search over two input fields, one for name of the business and one for the address of the business at the same time. Something like this in my template:

<input type="search" id="id_q" name="q1" placeholder="name" >
<input type="search" id="id_q" name="q2" placeholder="address" >

I didn't understand what should I do while reading the documents. I would appreciate it if you could help me in order to implement the backend to proceed with this.

MOHOSHA
  • 99
  • 8

0 Answers0