Пример #1
0
def search(request, template='search/search.html', load_all=True, 
        form_class=ModelSearchForm, searchqueryset=None,
        extra_context=None, 
        results_per_page=None):
    """
    """
    context = RequestContext(request)
    query = ''
    results = EmptySearchQuerySet()

    if request.GET.get('q'):
        form = form_class(request.GET, searchqueryset=searchqueryset, load_all=load_all)

        if form.is_valid():
            query = form.cleaned_data['q']
            results = form.search()
            context.update({'last_search': query})
            # if return no result, try it again with autocomplete search word
            if results.count() == 0:
                results = SearchQuerySet().autocomplete(enfname=request.GET.get('q', ''))
    else:
        form = form_class(searchqueryset=searchqueryset, load_all=load_all)

    selected_facets_list = []
    if request.GET.getlist('selected_facets'):
        for facet in request.GET.getlist('selected_facets'):
            if ":" not in facet:
                continue
            field, value = facet.split(":", 1)
            results = results.narrow(u'%s:"%s"' % (field, value))
            # 生成页面的facet
            selected_facets_list.append(('&selected_facets='+facet, value)) 
     
    selected_facets_context = list({
        'name': i[1], 
        'rm_selected_facet': ''.join(list(j[0] for j in selected_facets_list if j!=i))} 
        for i in selected_facets_list)

    context.update({'selected_facets_context': selected_facets_context})
    def facet_field_to_selector(sqs, name, context_name):

        try:
            fields = sqs.facet(name).facet_counts()['fields'][name]
            return {'name': context_name,
                'exact_name': name,
                'options': list({'context': i} for i in fields)}
        except:
            pass
        return None

    selectors = []
    # 找出品牌的facet
    selectors.append(facet_field_to_selector(results, 'brand', '品牌'))
    
    # 找出品类的facet
    selectors.append(facet_field_to_selector(results, 'categ', '品类'))
    context.update({'selectors': selectors})
    
    rm_invalid_result = []
    for r in results:
        try:
            tmp = r._get_object()
            if tmp:
                rm_invalid_result.append(tmp)
        except:
            pass
    paginator = HXPaginator(rm_invalid_result, results_per_page or 40)
    page = int(request.GET.get('page', 1))
    try:
        templates = paginator.page(page)
    except PageNotAnInteger:
        page = 1
    except EmptyPage:
        page = paginator.num_pages

    context.update({
        'form': form,
        'templates': templates,
        'paginator': paginator,
        'query': query,
        'suggestion': None,
    })

    if results.query.backend.include_spelling:
        context['suggestion'] = form.get_suggestion()
    if extra_context:
        context.update(extra_context)

    return TemplateResponse(request, template, context)
Пример #2
0
def catalogue_search(request, template='search/search.html', load_all=True,
    form_class=CatalogueSearchForm, searchqueryset=None, extra_context=None,
    results_per_page=None):
    """
    A more traditional view that also demonstrate an alternative
    way to use Haystack.

    Useful as an example of for basing heavily custom views off of.

    Also has the benefit of thread-safety, which the ``SearchView`` class may
    not be.

    Template:: ``search/search.html``
    Context::
        * form
          An instance of the ``form_class``. (default: ``ModelSearchForm``)
        * page
          The current page of search results.
        * paginator
          A paginator instance for the results.
        * query
          The query received by the form.
    """
    query = ''
    results = EmptySearchQuerySet()
    results_per_page = results_per_page or RESULTS_PER_PAGE

    if request.GET.get('q'):
        form = form_class(request.GET, searchqueryset=searchqueryset, load_all=load_all)

        if form.is_valid():
            query = form.cleaned_data['q']
            results = form.search()
    else:
        form = form_class(searchqueryset=searchqueryset, load_all=load_all)

    results = results.facet('categories').facet('country').facet('has_images').facet('global_region').facet('item_name')

    if form.is_valid():
        results = filter_with_facet(form, results, 'item_name', 'item_name')
        results = filter_with_facet(form, results, 'category', 'categories')
        results = filter_with_facet(form, results, 'global_region', 'global_region')
        results = filter_with_facet(form, results, 'country', 'country')

        if form.cleaned_data['person']:
            sqs = SearchQuerySet()
            for p in form.cleaned_data['person'].split():
                term = sqs.query.clean(p)
                results = results.narrow(u'people:"%s"' % term)

        if form.cleaned_data['has_images'] == True:
            results = results.narrow(u'has_images_exact:true')

    facets = results.facet_counts()

    if facets:
        # Prepare the form with all the available facets
        load_facets_into_form(form, facets, 'item_name', 'item_name')
        load_facets_into_form(form, facets, 'category', 'categories')
        load_facets_into_form(form, facets, 'global_region', 'global_region')
        load_facets_into_form(form, facets, 'country', 'country')

        # Append count of images into form
        appended_count = False
        for name, val in facets['fields']['has_images']:
            if name == 'true':
                form.fields['has_images'].label += ' (%s)' % val
                appended_count = True
        if not appended_count:
            form.fields['has_images'].label += ' (0)'

    results = results.order_by('registration_number')

    paginator = Paginator(results, results_per_page)

    try:
        page = paginator.page(int(request.GET.get('page', 1)))
    except InvalidPage:
        raise Http404("No such page of results!")

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

    # Store query for paging through results on item detail page
    if form.is_valid():
        request.session['search_query'] = form.cleaned_data
    # Access the first result to prevent ZeroDivisionError
    if results:
        results[0]
    request.session['search_results'] = results
    request.session['search_results_per_page'] = results_per_page

    if getattr(settings, 'HAYSTACK_INCLUDE_SPELLING', False):
        context['suggestion'] = form.get_suggestion()

    if extra_context:
        context.update(extra_context)

    return render(request, template, context)