Django Haystack自定义SearchView的漂亮网址

时间:2013-02-12 16:55:29

标签: django django-haystack

我正在尝试根据一些漂亮的网址设置Django Haystack进行搜索。这是我的urlpatterns。

urlpatterns += patterns('',
    url(r'^search/$', SearchView(), 
        name='search_all',
    ),
    url(r'^search/(?P<category>\w+)/$', CategorySearchView(
            form_class=SearchForm,
        ), 
        name='search_category',
    ),
)

我的自定义SearchView类如下所示:

class CategorySearchView(SearchView):
    def __name__(self):
        return "CategorySearchView"

    def __call__(self, request, category):
        self.category = category
        return super(CategorySearchView, self).__call__(request)

    def build_form(self, form_kwargs=None):
        data = None
        kwargs = {
            'load_all': self.load_all,
        }
        if form_kwargs:
            kwargs.update(form_kwargs)

        if len(self.request.GET):
            data = self.request.GET

        kwargs['searchqueryset'] = SearchQuerySet().models(self.category)

        return self.form_class(data, **kwargs)

如果我尝试访问/搜索/ Vendor / q = Microsoft

,我一直在运行Django dev web服务器时出现此错误
UserWarning: The model u'Vendor' is not registered for search.
  warnings.warn('The model %r is not registered for search.' % model)

这在我的页面上

The model being added to the query must derive from Model.

如果我访问/ search / q = Microsoft,它可以正常工作。还有另一种方法可以实现这个目标吗?

感谢您的任何指示 -Jay

1 个答案:

答案 0 :(得分:1)

这里有几件事情要发生。在__call__方法中,您根据网址中的字符串分配类别。在这个错误中:

UserWarning: The model u'Vendor' is not registered for search

注意unicode字符串。如果您收到The model <class 'mymodel.Model'> is not registered for search之类的错误,那么您就知道您没有为该模型正确创建索引。然而,这是一个字符串,而不是模型! models类上的SearchQuerySet方法需要一个类实例,而不是字符串。

您可以做的第一件事是使用该字符串按内容类型查找模型。这可能不是一个好主意!即使您没有索引的模型,您希望远离窥探,也至少会产生一些不必要的错误。

最好在视图中使用查找将查询路由到正确的模型索引,使用条件或字典。在__call__方法中:

self.category = category.lower()

如果你有几个型号:

my_querysets = {
    'model1': SearchQuerySet().models(Model1),
    'model2': SearchQuerySet().models(Model2),
    'model3': SearchQuerySet().models(Model3),
}
# Default queryset then searches everything
kwargs['searchqueryset'] = my_querysets.get(self.category, SearchQuerySet())