2013-02-12 2 views
2

나는 예쁜 장구를 기반으로 검색하기 위해 장고 건초 더미를 설정하려고합니다. 여기 내 urlpatterns입니다.Django Haystack 예쁜 검색을위한 SearchView

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) 

내가 시도하고 방문하는 경우 장고 dev에 웹 서버를 실행하는이 오류가 계속/검색/공급 업체/Q = 마이크로 소프트

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

이 에 대한

덕분에 일이 여기에가는 몇입니다. __call__ 메서드에서 URL의 문자열을 기반으로 카테고리를 지정합니다. 이 오류 :

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

유니 코드 문자열에 유의하십시오. The model <class 'mymodel.Model'> is not registered for search과 같은 오류가 발생하면 해당 모델에 대한 색인을 제대로 만들지 못했을 것입니다. 그러나 이것은 문자열이 아니라 모델입니다! SearchQuerySet 클래스의 models 메서드에는 문자열이 아닌 클래스 인스턴스가 필요합니다.

먼저 할 수있는 일은 해당 문자열을 사용하여 콘텐츠 유형별로 모델을 조회하는 것입니다. 이것은 아마 좋은 생각이 아닙니다! 눈을 피우지 않으려는 모델의 색인이 생성되지 않은 경우에도 최소한 불필요한 오류가 발생할 수 있습니다.

조건부 또는 사전을 사용하여 올바른 모델 색인으로 쿼리를 라우팅하는 데보기의 조회를 사용하는 것이 좋습니다. 당신의 __call__ 방법 :

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()) 
+0

bennylope 대단히 감사합니다 :

self.category = category.lower() 

그리고 경우에 당신은 몇 가지 모델이있다. 그게 내 정확한 문제를 해결! 그리고 내가하려는 일을 간소화했습니다. – titleistfour

+0

나는 당신이 무슨 일이 일어나고 있었는지 그리고 왜 그 일이 일어 났는지에 대해 충분히 설명 할 시간을 가졌음을 감사드립니다. 그건 나에게 매우 가치있는 일이다. 다시 감사합니다. – titleistfour

관련 문제