Django Haystack 添加额外的搜索输入

发布于 2024-12-16 16:09:42 字数 1037 浏览 4 评论 0原文

我的干草堆搜索目前可以很好地搜索以下模型:

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)

但现在我想在我的搜索表单的下拉列表中添加额外的搜索参数,其中包含 2 个值 [' Admin', 'Staff'] 因为我添加了另一个模型:

class StaffEntry(models.Model):
    product = models.ForeignKey('Product')
    number_entries = models.IntegerField(max_length=3,  null=True)

如果所选的下拉列表是“Staff”,我希望我的搜索在 StaffEntry 上搜索,并且 AdminEntry< /代码>是选择“管理员”。有人可以帮助我如何使用 Haystack 和 Whoosh 来实现这一目标吗?提前致谢。

I've a haystack search currently works well searching on the following model:

class AdminEntry(models.Model):
    product = models.ForeignKey('Product')
    number_entries = models.IntegerField(max_length=3,  null=True)

My 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)

but now I want to add additional search parameter in dropdown in my search form with 2 values ['Admin', 'Staff'] since I've added another model:

class StaffEntry(models.Model):
    product = models.ForeignKey('Product')
    number_entries = models.IntegerField(max_length=3,  null=True)

I want to my search to search on StaffEntry if the dropdown selected is 'Staff', and AdminEntry is 'Admin' is selected. Can someone help me on how to achieve this using Haystack with Whoosh? Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

画▽骨i 2024-12-23 16:09:42

您需要的是 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 了解有关如何在视图中使用自定义表单的信息。

What you're after is the ModelSearchForm:

http://django-haystack.readthedocs.org/en/latest/views_and_forms.html#modelsearchform

use this instead of the default SearchForm, and you'll get checkboxes for each indexed model. If you extend the form you'll be able to change it to a select instead of checkboxes.

See http://django-haystack.readthedocs.org/en/latest/views_and_forms.html#views for information on how to use your custom form in the view.

久隐师 2024-12-23 16:09:42

forms.py

类搜索(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

forms.py

class 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文