Beispiel #1
0
def search(request):
    """Search query. Use /api/search/?q=query"""
    # Question.objects.filter(content__search='Javascript')
    search_query = request.GET.get('q')
    if not search_query:
        return HttpResponse(status=404, content=b"Empty query string. Use /api/search/?q=query for search")
    if search_query.startswith('tag:'):
        # тег идет после tag: строго без пробела как в гуглопоиске
        tagword = search_query[4:]
        searchv = SearchVector('tags')
        searchv.default_alias = 'tag_search'
        found = Question.objects.filter(tags__tagword__iexact=tagword).order_by('-rating', '-created')
    else:
        searchv = SearchVector('title', 'content')
        searchv.default_alias = 'question_search'
        found = Question.objects.annotate(search=searchv).filter(search=search_query)\
            .order_by('-rating', '-created')
    paginator = PageNumberPagination()
    result_page = paginator.paginate_queryset(found, request)
    serializer = QuestionSerializer(result_page, many=True)
    return paginator.get_paginated_response(serializer.data)
Beispiel #2
0
def tag_search(request, tagword):
    searchv = SearchVector('tags')
    searchv.default_alias = 'tag_search'
    found = Question.objects.filter(tags__tagword__iexact=tagword).order_by(
        '-rating', '-created')
    paginator = Paginator(found, 20)
    page = request.GET.get('page')
    questions = paginator.get_page(page)
    return render(
        request, 'questions/tag.html', {
            'questions': questions,
            'title': f'Tag: #{tagword}',
            'tagword': tagword,
            'count': paginator.count,
            'trending': _get_trending(),
        })
Beispiel #3
0
def search(request):
    # Question.objects.filter(content__search='Javascript')
    search_query = request.GET.get('q')
    if search_query.startswith('tag:'):
        # тег идет после tag: строго без пробела как в гуглопоиске
        return tag_search(request, search_query[4:])
    searchv = SearchVector('title', 'content')
    searchv.default_alias = 'question_search'
    found = Question.objects.annotate(search=searchv).filter(search=search_query)\
        .order_by('-rating', '-created')
    paginator = Paginator(found, 20)
    page = request.GET.get('page')
    questions = paginator.get_page(page)
    return render(
        request, 'questions/search.html', {
            'questions': questions,
            'title': f'Search: "{search_query}"',
            'search_query': search_query,
            'count': paginator.count,
            'trending': _get_trending(),
        })