嗯,我已经把我的头发拉出了这个好几个小时,现在想通过寻求帮助的时候了,因为我无法找出原因这是通过谷歌搜索...django-haystack with whoosh - 无法通过布尔字段进行过滤
本质上,我正在做一个分类类型的应用程序,我需要一个搜索表单来搜索数据库和筛选基于各种标准。我使用django,haystack和whoosh,并且我几乎可以正常工作,但似乎无法使用布尔变量进行过滤。我已经成功地过滤了Charfield类别,它完美地工作,但是当我尝试添加基于for_sale布尔值(或任何布尔值)的过滤器时,它不会过滤任何内容并返回相同的结果,如果它从来没有被称为(我已经检查过,它实际上被称为)。
任何人有任何想法?
我的模型的相关部分:
class Listing(models.Model):
SALE_CHOICES=((True, 'Items for sale'),
(False, 'Items wanted'))
for_sale = models.BooleanField(choices=SALE_CHOICES, default=True)
CAT_CHOICES = ((WOOD, "Woods"), (BRICKS, "Bricks"), etc)
category = models.CharField(max_length=6, choices = CAT_CHOICES, default = WOOD)
这是我的房源指数类:
class ListingIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
text_content = indexes.CharField(model_attr='text_content')
created = indexes.DateTimeField(model_attr='created')
url = indexes.CharField(model_attr='url')
price = indexes.CharField(model_attr='price', null=True)
city = indexes.CharField(model_attr='city', null=True)
category = indexes.CharField(model_attr='category')
for_sale = indexes.BooleanField(model_attr='for_sale', default=True)
def get_model(self):
return Listing
def index_queryset(self, using=None):
return self.get_model().objects.filter(expired=False).filter(verified=True)
我伸出SearchForm和搜索查看:
class ListingSearchForm(FacetedSearchForm):
cat = forms.CharField(required=False, widget=forms.Select(choices=get_listings_categories()))
type = forms.CharField(required=False, widget=forms.HiddenInput)
for_sale = forms.BooleanField(required=False, widget=forms.Select(choices=get_sale_categories()))
def search(self):
# First, store the SearchQuerySet received from other processing.
sqs = super(ListingSearchForm, self).search()
# Check to see if a category was chosen.
if self.cleaned_data['cat']:
sqs = sqs.filter(category=self.cleaned_data['cat'])
# Check to see if a type was chosen.
if self.cleaned_data['for_sale']:
sqs = sqs.filter(for_sale=self.cleaned_data['for_sale'])
return sqs
class ListingSearchView(SearchView):
def extra_context(self):
extra = super(ListingSearchView, self).extra_context()
extra['post_type'] = self.request.GET.get('type', None)
extra['cat'] = self.request.GET.get('cat', None)
extra['for_sale'] = self.request.GET.get('for_sale', None)
return extra
最后我的房源指数文本文件:
{{ object.title }}
{{ object.text_content }}
{{ object.created }}
{{ object.url }}
{{ object.category }}
{{ object.price }}
{{ object.city }}
{{ object.for_sale }}
django-haystack有两个版本,1.x和2.x,人们(至少我是)在生产中成功使用haystack 2.x。你使用什么版本? – n3storm
我正在使用haystack 1.x. 我结束了重新工作我的for_sale字段作为CharField,现在我能够过滤罚款。 干草堆或飞快移动只是不喜欢布尔人我猜哈哈。 – user2184916