2010-08-17 3 views
0

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

답변

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)