2010-01-14 3 views
0

Cette vue fonctionne lorsque la requête est dans la base de données.Comment intercepter l'erreur 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.') 

Donc, si q=delelle il trouve d'autres avocats dans la base de données qui est diplômé de la même école la même année. Si q=collins et collins est dans la base de données mais il n'y a pas d'autres avocats diplômés de la même école la même année, il donne alors le message d'erreur approprié "Aucun avocat ne correspond à vos critères de recherche."

Mais si q=moritz et il n'y a aucun avocat nommé moritz dans la base de données alors il donne une erreur interne de serveur 500.

Je ne comprends pas la notation request.GET['q'] ou comment je peux corriger cela afin que je puisse ajouter le texte approprié pour le cas où la requête ne se trouve pas dans la base de données. Pouvez-vous me diriger dans la bonne direction? Merci.

Modifier re Antony Hatchkins répondre

Le code ci-dessous fonctionne sans donner l'erreur. Je vais essayer d'intégrer le reste bientôt:

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.') 

Répondre

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'] récupère le terrain q de l'objet de requête de navigateur client GET

+0

Votre La fonction d'origine prendrait un élément aléatoire de la base de données si plusieurs éléments correspondent, ce qui est douteux. Ce code informera sur la question –

+0

Merci. Je n'ai pas réalisé cela. Mais je pense, vous avez édité votre réponse initiale. Au début, je ne pouvais pas le faire fonctionner, puis j'ai changé un peu, maintenant ça marche. J'ai créé un nouveau modèle not_in_database.html et cela va le gérer. Je posterai le code sous peu. J'apprécierais les commentaires. Merci. – Zeynel

+0

Bienvenue. Oui, j'ai corrigé une faute de frappe ou deux. –

1

Cela devrait faire l'affaire (non testé):

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

Dans mon premier essai, j'ai encore l'erreur 500. Je peux faire quelque chose de mal. – Zeynel

Questions connexes