2015-04-06 12 views
2

如果在商店模型的名稱屬性上有完全匹配,我有要求將用戶重定向到詳細信息頁面。在任何其他財產的情況下,它應該採取搜索結果頁面,不管直接匹配與否。django乾草堆分面搜索重定向如果發現與屬性完全匹配

我目前使用FacetedSearchCustomView重寫buid_page,create_reponseextra_content methods.But我不能找到一種方法來看看查詢的結果作爲內部被query._results保護。

關於如何去做這件事的任何建議。

感謝

修訂

FacetedSearchCustomView.py

class FacetedSearchCustomView(FacetedSearchView): 
""" 
Overrides various default methods to allow for additional context, smoother UX for faceting 
""" 

def build_page(self): 
    """ 
    Paginates the results appropriately. 

    Overriden to redirect to page 1 if a page_no is not found 
    """ 
    try: 
     page_no = int(self.request.GET.get('page', 1)) 
    except (TypeError, ValueError): 
     raise Http404("Not a valid number for page.") 

    if page_no < 1: 
     raise Http404("Pages should be 1 or greater.") 

    paginator = NamedPaginator(self.results, on="brand", per_page=self.results_per_page) 
    # import pdb; pdb.set_trace() 
    try: 
     page = paginator.page(page_no) 
    except InvalidPage: 
     # Redirect to page 1 of the 
     path = self.request.path 
     qs = self.request.GET.copy() 
     qs['page'] = 1 
     url = '%s?%s' % (path, qs.urlencode()) 
     return redirect(url) 

    return paginator, page 

def clean_filters(self): 
    """Returns a list of tuples (filter, value) of applied facets""" 
    filters = [] 
    # get distinct facets 
    facets = list(set(self.form.selected_facets)) 
    for facet in facets: 
     if ":" not in facet: 
      continue 
     field, value = facet.split(":", 1) 
     field = field.replace('_', ' ').replace('exact', '').title() 
     filters.append((field, value)) 
    return filters 

def create_response(self): 
    """ 
    Generates the actual HttpResponse to send back to the user. 

    Overriding to allow the redirect to pass through from overriden build_page 
    """ 
    try: 
     (paginator, page) = self.build_page() 
    except ValueError: 
     return self.build_page() 

    context = { 
     'query': self.query, 
     'form': self.form, 
     'page': page, 
     'paginator': paginator, 
     'suggestion': None, 
    } 

    if self.results and hasattr(self.results, 'query') and self.results.query.backend.include_spelling: 
     context['suggestion'] = self.form.get_suggestion() 

    context.update(self.extra_context()) 
    return render_to_response(self.template, context, context_instance=self.context_class(self.request)) 

def extra_context(self): 
    extra = super(FacetedSearchCustomView, self).extra_context() 
    extra['filters'] = self.clean_filters() 
    if not self.results: 
     extra['facets'] = self.form.search().facet_counts() 
    else: 
     extra['facets'] = self.results.facet_counts() 

    model_type = self.request.path.split('/')[1].rstrip('s') 
    extra['model_type'] = None if model_type == "search" else model_type 

    # if model_type in ['package', 'project']: 
    # extra['facets'] = self.clean_facets(extra['facets']) 
    #  extra['model_create'] = '%s_create' % model_type 
    return extra 

CustomSearchForm.py

class CustomSearchForm(FacetedSearchForm): 

def search(self): 
    sqs = super(CustomSearchForm, self).search() 

    # We need to process each facet to ensure that the field name and the 
    # value are quoted correctly and separately: 
    for facet in self.selected_facets: 
     if ":" not in facet: 
      continue 

     field, value = facet.split(":", 1) 

     if value: 
      sqs = sqs.narrow(u'%s:"%s"' % (field, sqs.query.clean(value))) 

    return sqs 
+0

我們可以看到代碼已經寫好了嗎? – 2015-04-13 01:13:49

回答

相關問題