【问题标题】:Django Haystack Custom Search FormDjango Haystack 自定义搜索表单
【发布时间】:2016-11-04 13:24:08
【问题描述】:

我有一个基本的 django-haystack SearchForm 工作正常,但现在我正在尝试创建一个自定义搜索表单,其中包含几个额外的字段供过滤。

我已经按照 Haystack 文档创建自定义表单和视图,但是当我尝试查看表单时,我只能得到错误:

ValueError at /search/calibration/

The view assetregister.views.calibration_search didn't return an HttpResponse object. It returned None instead.

不应该基于 SearchForm 来处理返回一个 HttpResponse 对象吗?

forms.py

from django import forms
from haystack.forms import SearchForm

class CalibrationSearch(SearchForm):
    calibration_due_before = forms.DateField(required=False)
    calibration_due_after = forms.DateField(required=False)

    def search(self):
        #First we need to store SearchQuerySet recieved after / from any other processing that's going on
        sqs = super(CalibrationSearch, self).search()

        if not self.is_valid():
            return self.no_query_found()

        #check to see if any date filters used, if so apply filter
        if self.cleaned_data['calibration_due_before']:
            sqs = sqs.filter(calibration_date_next__lte=self.cleaned_data['calibration_due_before'])

        if self.cleaned_data['calibration_due_after']:
            sqs = sqs.filter(calibration_date_next__gte=self.cleaned_data['calibration_due_after'])

        return sqs

views.py

from .forms import CalibrationSearch
from haystack.generic_views import SearchView
from haystack.query import SearchQuerySet


def calibration_search(SearchView):
    template_name = 'search/search.html'
    form_class = CalibrationSearch
    queryset = SearchQuerySet().filter(requires_calibration=True)

    def get_queryset(self):
        queryset = super(calibration_search, self).get_queryset()
        return queryset

urls.py

from django.conf.urls import include, url
from . import views

urlpatterns = [
    ....
    url(r'^search/calibration/', views.calibration_search, name='calibration_search'),
    ....
]

【问题讨论】:

    标签: python django django-forms django-views django-haystack


    【解决方案1】:

    Haystack 的SearchView 是基于类的视图,添加url 条目时必须调用.as_view() 类方法。

    url(r'^search/calibration/', views.calibration_search.as_view(), name='calibration_search'),
    

    【讨论】:

    • 啊,这样的小事还是让我抓狂!修复导致我出现另一个错误object has no attribute 'as_view',这是因为我使用了def calibration_search(SearchView): 而不是class calibration_search(SearchView): 至少我现在可以正确看到表单,唯一的问题是无论如何它都不会返回任何结果我搜索的内容...
    • 您是否使用rebuild_index 命令将数据添加到搜索索引?
    • 我有,我知道索引正在工作,因为我可以使用 haystack-browser 在管理界面中查看它,而我的其他(主要)搜索表单仍然可以正常工作。出于某种原因,我的自定义表单没有得到任何结果。
    【解决方案2】:

    这对我有帮助。

    " 去掉 search.html 模板上的 "page" 前缀就成功了,而且是一个很好的临时解决方案。但是,当需要对结果进行分页时,它就变成了一个问题。所以环顾四周,解决方案是使用“page_obj”前缀而不是“page”,一切都按预期工作。似乎问题是 haystack-tutorial 假设页面对象称为“page”,而某些版本的 django 称为“page_obj”?我'确定有更好的答案 - 我只是报告我有限的发现。”

    看到这个:Django-Haystack returns no results in search form

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2013-02-12
      • 2014-07-17
      • 2012-12-29
      • 2016-12-18
      相关资源
      最近更新 更多