2

きれいな URL に基づいて検索するように 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)

/search/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 にアクセスすると、問題なく動作します。これを達成する別の方法はありますか?

ご指摘ありがとうございます - ジェイ

4

1 に答える 1

1

ここでいくつかのことが起こっています。__call__メソッドでは、URL の文字列に基づいてカテゴリを割り当てています。このエラーでは:

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

ユニコード文字列に注意してください。次のようなエラーが発生した場合は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 に答える