Django Haystack 添加额外输入到搜索中

2 投票
2 回答
1564 浏览
提问于 2025-04-17 06:30

我现在有一个搜索功能,能够很好地在以下模型中进行搜索:

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

撰写回答