2010-01-14 3 views
0

이 뷰는 쿼리가 데이터베이스에있을 때 작동합니다.Django request.GET 오류를 잡는 방법?

def search(request): 
    if 'q' in request.GET and request.GET['q']: 
     q = request.GET['q'] 
     q_school = Lawyer.objects.filter(last__icontains=q).values_list('school', flat=True) 
     q_year = Lawyer.objects.filter(last__icontains=q).values_list('year_graduated', flat=True) 
     lawyers = Lawyer.objects.filter(school__icontains=q_school[0]).filter(year_graduated__icontains=q_year[0]).exclude(last__icontains=q)   
     return render_to_response('search_results.html', {'lawyers': lawyers, 'query': q}) 
    else: 
     return HttpResponse('Please submit a search term.') 

그래서, q=delelle는이 같은 해에 같은 학교를 졸업 한 데이터베이스에서 다른 변호사를 발견합니다.

및 collins가 데이터베이스에 있지만 같은 해에 같은 학교를 졸업 한 다른 변호사가 없다면 "변호사가 검색 기준과 일치하지 않습니다."라는 적절한 오류 메시지가 나타납니다.

그러나 q=moritz이고 데이터베이스에 moritz이라는 변호사가없는 경우 500 내부 서버 오류가 발생합니다.

request.GET['q'] 표기법을 이해하지 못하거나이 문제를 해결하여 데이터베이스에 쿼리가없는 경우 대문자를 추가 할 수 있습니다. 올바른 방향으로 나를 가르쳐 주시겠습니까? 감사.

편집 다시 안토니 Hatchkins는

아래의 코드는 오류를 포기하지 않고 작동 대답합니다. 나는 곧 나머지를 통합하려고합니다 :

def search(request): 
    if 'q' in request.GET and request.GET['q']: 
     q = request.GET['q'] 
     lawyer = Lawyer.objects.filter(last__icontains=q) 
     if len(lawyer)==0: 
      return render_to_response('not_in_database.html', {'query': q}) 
     else: 
      q_school = Lawyer.objects.filter(last__icontains=q).values_list('school', flat=True) 
      q_year = Lawyer.objects.filter(last__icontains=q).values_list('year_graduated', flat=True) 
      lawyers = Lawyer.objects.filter(school__icontains=q_school[0]).filter(year_graduated__icontains=q_year[0]).exclude(last__icontains=q)   
     return render_to_response('search_results.html', {'lawyers': lawyers, 'query': q}) 
    else: 
     return HttpResponse('Please submit a search term.') 

답변

2
def search(request): 
    q = request.GET.get('q', '') 
    if q: 
     lawyers = Lawyer.objects.filter(last__icontains=q) 
     if len(lawyers)==0: 
      return HttpResponse('No such lawyer') 
     if len(lawyers)>1: 
      return HttpResponse('Several lawyers matched') 
     lawyers1 = Lawyer.objects.filter(school=lawyers[0].school).filter(year_graduated=lawyers[0].year).exclude(pk=lawyers[0].pk)   
     return render_to_response('search_results.html', {'lawyers': lawyers1, 'query': q}) 
    else: 
     return HttpResponse('Please submit a search term.') 

request.GET['q']는 클라이언트 브라우저의 GET 요청 객체에서 필드 q를 가져

+0

당신의 원래 함수는 데이터베이스에서 임의의 항목을 취합니다. 여러 항목이 일치하는 경우 의심 스러우며 예상 한 것입니다. 이 코드는 문제에 대해 알려 드릴 것입니다 –

+0

감사합니다. 나는 이것을 깨닫지 못했다. 하지만 제 생각에, 당신은 초기 대답을 편집했습니다. 처음에 나는 그것을 작동시키지 못했고, 조금은 바뀌 었습니다. 이제는 작동하고 있습니다. 새 템플릿 not_in_database.html을 만들었습니다. 그러면이 템플릿이 처리됩니다. 조만간 코드를 게시 할 예정입니다. 나는 주석을 고맙게 생각한다. 감사. – Zeynel

+0

환영합니다. 예. 오타 또는 2 개를 수정했습니다. –

1

이 트릭 (테스트하지) 수행해야합니다

def search(request): 
    if 'q' in request.GET and request.GET['q']: 
     q = request.GET['q'] 
     try: 
      q_school = Lawyer.objects.filter(last__icontains=q).values_list('school', flat=True) 
      q_year = Lawyer.objects.filter(last__icontains=q).values_list('year_graduated', flat=True) 
      lawyers = Lawyer.objects.filter(school__icontains=q_school[0]).filter(year_graduated__icontains=q_year[0]).exclude(last__icontains=q)   
     except Lawyer.DoesNotExist: 
      lawyers = [] 
     return render_to_response('search_results.html', {'lawyers': lawyers, 'query': q}) 
    else: 
     return HttpResponse('Please submit a search term.') 
+0

첫 번째 시도에서 500 오류가 다시 발생했습니다. 나는 뭔가 잘못하고 있을지도 모른다. – Zeynel