2016-08-25 35 views
0

我有一个基于以下功能视图UnboundLocalError局部变量

def post_search(request): 
    form = SearchForm() 
    if 'query' in request.GET: 
     form = SearchForm(request.GET) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() 
      # count total results 
      total_results = results.count() 
    return render(request, 'blog/post/search.html', {'form': form, 
                'cd': cd, 
                'results': results, 
                'total_results': total_results}) 

当我执行我的网址是调用这个函数,我得到以下错误

UnboundLocalError: local variable 'cd' referenced before assignment 
    [25/Aug/2016 22:48:13] "GET /blog/search/ HTTP/1.1" 500 69440 

cdresultstotal_results变量在最后被声明并在与return render(request ...)句子不同的范围内使用。

这是出于这个原因的错误。

我初始化这个变量作为这样一个全局变量:

cd = results=total_results=None 

的条件句

def post_search(request): 
    form = SearchForm() 

    # Initialize variables 
    cd = results=total_results=None 
    if 'query' in request.GET: 
     form = SearchForm(request.GET) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() 
      # count total results 
      total_results = results.count() 
    return render(request, 'blog/post/search.html', {'form': form, 
                'cd': cd, 
                'results': results, 
                'total_results': total_results}) 

前和我的GET请求,它的工作原理

[25/Aug/2016 23:05:33] "GET /blog/search/ HTTP/1.1" 200 2260 

我可以通过其他方式解决这个问题吗? 此功能用于在网络中搜索, 当我有许多用户使用此功能时,这是否正确?

我认为解决方案不是很好的做法......我不知道。

+0

当一个问题得到解决时,您不应该更新您的问题。因为回答问题的人不会知道问题已更新。相反,发布另一个问题 –

+0

我相信你的原始问题已经解决,你正在面临新的问题。 –

+0

嗨@MoinuddinQuadri我第一次打我的问题已经有了明确的解决方案。当我询问初始化变量的解决方案是否合适时,我只是更新我的问题。你在我的问题中引用我的一个善意的方式,这是我问题的起源。 – bgarcial

回答

1

这意味着,或者您的form.is_valid()False或者,您没有提出GET请求。

加上cd = results = total_results = None之前的第一个条件。因为在您当前的代码中,如果if条件中的任何一个条件失败,cd,resultstotal_results将不会被初始化,因此会引发此错误。你更新的代码应该是:

def post_search(request): 
    form = SearchForm() 
    cd = results = total_results = None # <--- Add this to your code 
    if 'query' in request.GET: 
     . . . Something Something 
    return render(request, 'blog/post/search.html', {'form': form, 
                'cd': cd, 
                'results': results, 
                'total_results': total_results}) 
+0

初始化变量,显然是一个解决方案,这是一个很好的做法或不管我的问题没有意义吗? – bgarcial

+1

这不是一个好习惯。你需要以更好的方式处理它。因为,如果任何条件不满足,这意味着这是一个无效的请求。你应该返回适​​当的回应信息。例如,你的代码只支持'GET'调用。如果方法不是'GET'则返回'不支持的请求类型错误'。如果表单无效,请求用户输入有效的表单。在这两种情况下返回'400'状态代码即坏请求 –

+0

我明白你告诉我。我想问问你是否有可能让我更多地了解与你的建议有关的另一种方法。为了管理可能出现的情况或例外情况,您是否可以帮助我提供响应消息,以考虑“POST”和“GET”调用?请原谅我的勇气与这个请愿 – bgarcial

1
def post_search(request): 
#cd = results = total_results = None 
form = SearchForm() 
if 'query' in request.GET: 
    form = SearchForm(request.GET) 
    if form.is_valid(): 
     cd = form.cleaned_data 
     results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() 
     total_results = results.count() 
    return render(request, 
        'blog/post/search.html', 
        {'form': form, 
        'cd': cd, 
        'results': results, 
        'total_results': total_results}) 
return render(request,'blog/post/search.html', {'form': form}) 

这项工作很好。 享受

相关问题