Индекс рефакторинга / представление поиска - PullRequest
0 голосов
/ 17 августа 2010

Я написал индекс и просмотр поиска все в одном, если обнаружен запрос GET, он возвращает только результаты поиска, в противном случае он возвращает все записи.Я написал эту точку зрения ниже, но я чувствую, что повторяю себя слишком много.Будем очень благодарны за любые идеи относительно того, как я могу немного уменьшить этот код.

def index(request):
    if 'q' in request.GET:
        company_list = Company.objects.filter(
            Q(company__icontains = request.GET['q']) | 
            Q(county__icontains = request.GET['q']) | 
            Q(city__icontains = request.GET['q']) |
            Q(product_description__icontains = request.GET['q'])
        )
        query = request.GET['q']
    else:
        company_list = Company.objects.all()

    paginator = Paginator(company_list, 10)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        companies = paginator.page(page)
    except (EmptyPage, InvalidPage):
        companies = paginator.page(paginator.num_pages)

    if 'q' in request.GET:
        return render_response(request, 'database/index.html', {"companies": companies, "query": query})
    else:
        return render_response(request, 'database/index.html', {"companies": companies})

Ответы [ 2 ]

0 голосов
/ 18 августа 2010

Я закончил абстрагированием нумерации страниц в отдельную функцию, которая выглядит следующим образом.

def pagination(request, objects, pages):
    paginator = Paginator(objects, pages)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        results = paginator.page(page)
    except (EmptyPage, InvalidPage):
        results = paginator.page(paginator.num_pages)

    return results

И я смог реорганизовать функцию индексации / поиска до этой.

def index(request):
    if 'q' in request.GET:
        company_list = Company.objects.filter(
            Q(company__icontains = request.GET['q']) | 
            Q(county__icontains = request.GET['q']) | 
            Q(city__icontains = request.GET['q']) |
            Q(product_description__icontains = request.GET['q'])
        )
        query = request.GET['q']
        companies = pagination(request, company_list, 10)
        return render_response(request, 'database/index.html', {"companies": companies, "query": query})
    else:
        company_list = Company.objects.all()
        companies = pagination(request, company_list, 10)
        return render_response(request, 'database/index.html', {"companies": companies})

Мне все еще не нравится, что я повторяю линию нумерации страниц, но это кажется немного лучше.

0 голосов
/ 18 августа 2010

Возможно, не самый лучший способ, но для меня это делает его немного более читабельным и сводит к минимуму повторения.

def index(request):
    def get_companies(company_list):
        paginator = Paginator(company_list, 10)

        try:
            page = int(request.GET.get('page', '1'))
        except ValueError:
            page = 1

        try:
            companies = paginator.page(page)
        except (EmptyPage, InvalidPage):
            companies = paginator.page(paginator.num_pages)

    return companies

    
    if 'q' in request.GET:
        companies = get_companies(
            Company.objects.filter(
                Q(company__icontains = request.GET['q']) | 
                Q(county__icontains = request.GET['q']) | 
                Q(city__icontains = request.GET['q']) |
                Q(product_description__icontains = request.GET['q'])
            ))
        query = request.GET['q']
        context =  {"companies": companies, "query": query}

    else:
        companies = get_companies(Company.objects.all())
        context = {"companies": companies}

    return render_response(request, 'database/index.html',context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...