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