我正在尝试根据一些漂亮的网址设置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
答案 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())