2010-08-17 73 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)