【问题标题】:How to catch Django request.GET error?如何捕捉 Django request.GET 错误?
【发布时间】:2010-01-14 15:57:13
【问题描述】:

当查询在数据库中时,此视图有效。

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,那么它会在数据库中找到同年从同一所学校毕业的其他律师。

如果 q=collins 和 collins 在数据库中,但没有其他同年从同一所学校毕业的律师,则它会给出相应的错误消息“没有律师符合您的搜索条件。”

但是如果q=moritz 并且数据库中没有名为moritz 的律师,那么它会给出500 内部服务器错误。

我不明白request.GET['q'] 表示法或如何解决这个问题,以便在查询不在数据库中时添加正确的文本。你能指出我正确的方向吗?谢谢。

编辑安东尼哈奇金斯的答案

以下代码可以正常工作而不会出现错误。我会尽快合并其余的:

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

【问题讨论】:

    标签: django django-forms


    【解决方案1】:
    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

    【讨论】:

    • 如果有几个项目匹配,您的原始函数将从数据库中随机获取项目,这可能是您所期望的。此代码将告知问题
    • 谢谢。我没有意识到这一点。但我认为,您编辑了最初的答案。起初我无法让它工作,然后我改变了一点,现在它可以工作了。我创建了一个新模板 not_in_database.html,它将处理它。我将尽快发布代码作为编辑。我会很感激cmets。谢谢。
    • 欢迎。是的,我修正了一两个错字。
    【解决方案2】:

    这应该可以解决问题(未经测试):

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

    【讨论】:

    • 在我的第一次尝试中,我再次遇到了 500 错误。我可能做错了什么。
    猜你喜欢
    • 2010-12-06
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2017-09-22
    • 2016-06-02
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多