Python 重构索引/搜索视图
我已经编写了一个索引和搜索视图,如果检测到GET请求,它将只返回搜索结果,否则它将返回所有记录。我在下面写了这个观点,但我觉得我重复了太多。任何关于如何将代码精简一点的想法都将不胜感激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']) |
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})
我仍然不喜欢我重复的分页行,但它似乎有点好