Python 重构索引/搜索视图

Python 重构索引/搜索视图,python,django,Python,Django,我已经编写了一个索引和搜索视图,如果检测到GET请求,它将只返回搜索结果,否则它将返回所有记录。我在下面写了这个观点,但我觉得我重复了太多。任何关于如何将代码精简一点的想法都将不胜感激 def index(request): if 'q' in request.GET: company_list = Company.objects.filter( Q(company__icontains = request.GET['q']) |

我已经编写了一个索引和搜索视图,如果检测到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})

也许不是最好的方法,但对我来说,这使它更具可读性,并尽量减少重复

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)

我最终将分页抽象为一个单独的函数,如下所示

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})
我仍然不喜欢我重复的分页行,但它似乎有点好