Haystack SearchForm Update Choices based on SQS

Skip to first unread message

Jonathan Benoit

Sep 28, 2016, 2:47:46 PM9/28/16
to django-haystack
I'm stuck and I'm hoping someone here can point me in the right direction.

I have a SearchForm that lets the user filter their search results when they select certain choices from available fields.

As you can see by the code below, instead of getting the CHOICES via the SearchQuerySet, I'm using Django's QuerySet instead. Further down the code, I'm using haystack SearchQuerySet to return the results.

What I'm having trouble with is modifying this to use the SearchQuerySet for CHOICES, so that each selection will narrow the available choices based on the SQS.

Any help is much appreciated.

class CustomSearchForm(SearchForm):
    def no_query_found(self):
        return self.searchqueryset.all()

    retailers = sorted(tuple(set([(choice, choice) for choice in 
        Retailer.objects.order_by('retailer_name').values_list('retailer_name', flat=True)])))

    brands = sorted(tuple(set([(choice, choice) for choice in 
        Brand.objects.exclude(brand_name__isnull=True).order_by('brand_name').values_list('brand_name', flat=True)])))

    categories = sorted(tuple(set([(choice, choice) for choice in 
        Category.objects.order_by('category_name').values_list('category_name', flat=True)])))

    colors = sorted(tuple(set([(choice, choice) for choice in 
        Color.objects.values_list('color_true', flat=True)])))

    sizes = sorted(tuple(set([(choice, choice) for choice in 
        Size.objects.values_list('size_true', flat=True)])))

    sorting = (('1','Random'),('2','Last Updated (most recent)'),('3','Regular Price'),('4','Sale Price'),)

    sort = forms.ChoiceField(choices = sorting, label="Sort By",label_suffix='',initial='1', widget=forms.Select(attrs = {'onchange' : "this.form.submit();", }), required=False)
    onsale = forms.BooleanField(required=False,widget=forms.CheckboxInput(attrs = {'onclick' : "this.form.submit();", }), label='On Sale', label_suffix='')
    retailer = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs = {'onclick' : "this.form.submit();", }), choices=retailers, label_suffix='',required = False)
    brand = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs = {'onclick' : "this.form.submit();", }), choices=brands, label_suffix='',required = False)
    category = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs = {'onclick' : "this.form.submit();", }), choices=categories, label_suffix='',required = False)
    color = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs = {'onclick' : "this.form.submit();", }), choices=colors, label_suffix='',required = False)
    size = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs = {'onclick' : "this.form.submit();", }), choices=sizes, label_suffix='',required = False)
    q = forms.CharField(required=False,widget=forms.TextInput(attrs={'type': 'search','placeholder':'Search'}), label='')

    def search(self):

        sqs = super(CustomSearchForm, self).search()

        if not self.is_valid():
            return self.no_query_found()

        if self.cleaned_data['retailer']:
            sqs = sqs.filter_and(retailer__in = self.cleaned_data['retailer'])

        if self.cleaned_data['brand']:
            sqs = sqs.filter_and(brand__in = self.cleaned_data['brand'])

        if self.cleaned_data['category']:
            sqs = sqs.filter_and(category__in = self.cleaned_data['category'])

        if self.cleaned_data['color']:
            sqs = sqs.filter_and(color__in = self.cleaned_data['color']) 

        if self.cleaned_data['size']:
            sqs = sqs.filter_and(size__in = self.cleaned_data['size']) 

        if self.cleaned_data['onsale']:
            sqs = sqs.filter_and(is_sale__exact = self.cleaned_data['onsale'])

        if self.cleaned_data['sort'] == '1':
            sqs = sqs.order_by('?')     
        if self.cleaned_data['sort'] == '2':
            sqs = sqs.order_by('-last_updated')
        if self.cleaned_data['sort'] == '3':
            sqs = sqs.order_by('-price')
        if self.cleaned_data['sort'] == '4':
            sqs = sqs.order_by('-sale_price')

        return sqs
Reply all
Reply to author
0 new messages