Django Haystack 添加额外输入到搜索中
我现在有一个搜索功能,能够很好地在以下模型中进行搜索:
class AdminEntry(models.Model):
product = models.ForeignKey('Product')
number_entries = models.IntegerField(max_length=3, null=True)
我的 search_indexes.py
文件是:
class AdminEntryIndex(SearchIndex):
text = CharField(document=True, use_template=True)
author = CharField(model_attr='product__author')
title = CharField(model_attr='product__title')
desc = CharField(model_attr='product__desc')
def get_queryset(self):
return AdminEntry.objects.all()
site.register(AdminEntry, AdminEntryIndex)
但现在我想在搜索表单中添加一个下拉菜单,里面有两个选项 ['Admin', 'Staff']
,因为我又添加了一个新的模型:
class StaffEntry(models.Model):
product = models.ForeignKey('Product')
number_entries = models.IntegerField(max_length=3, null=True)
我希望当下拉菜单选择的是 'Staff' 时,搜索能在 StaffEntry
中进行;而当选择 'Admin' 时,搜索则在 AdminEntry
中进行。有没有人能帮我用 Haystack 和 Whoosh 实现这个功能?提前谢谢大家。
2 个回答
0
forms.py
这里定义了一个叫做Search的类,它是从SearchForm这个类继承过来的。
OPTIONS = [
('staff','Staff'),
('admin','Admin')
]
option = forms.ChoiceField(
widget=forms.Select(
attrs={'class':'cd-select','id':'cd-dropdown'}),
label='',
choices=OPTIONS,
)
def __init__(self, *args, **kwargs):
super(Search, self).__init__(*args, **kwargs)
self.initial['option'] = 'staff'
self.fields['q'].label = ''
def search(self):
if not self.is_valid():
return self.no_query_found()
if not self.cleaned_data.get('q'):
return self.no_query_found()
sqs = self.searchqueryset.auto_query(self.cleaned_data['q'])
if self.cleaned_data['option'] == 'staff':
sqs = SearchQuerySet().auto_query(self.cleaned_data['q']).models(Staff)
elif self.cleaned_data['option'] == 'admin':
sqs = SearchQuerySet().auto_query(self.cleaned_data['q']).models(Admin)
if self.load_all:
sqs = sqs.load_all()
return sqs
0
你需要的是 ModelSearchForm:
http://django-haystack.readthedocs.org/en/latest/views_and_forms.html#modelsearchform
用这个替代默认的 SearchForm,你就能为每个已索引的模型得到复选框。如果你对这个表单进行扩展,你可以把复选框改成下拉选择框。
想了解如何在视图中使用你自定义的表单,可以查看 http://django-haystack.readthedocs.org/en/latest/views_and_forms.html#views。