2

我正在尝试将 Django Haystack 设置为基于一些漂亮的 url 进行搜索。这是我的 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)

如果我尝试访问 /search/Vendor/q=Microsoft,我在运行 Django 开发 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

4

1 回答 1

1

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

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())
于 2013-02-12T22:04:27.117 回答