2010-08-17 5 views
0

Я написал индекс и поиск, чтобы просмотреть все в одном, если обнаружен запрос GET, он возвращает только результаты поиска, иначе он возвращает все записи. Я написал этот взгляд ниже, но мне кажется, что я слишком много повторяю. Любые идеи относительно того, как я могу немного уменьшить этот код, будут высоко оценены.Рефакторинг Index/Search View

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}) 

ответ

0

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

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

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

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)