在赋值/考虑之前引用的UnboundLocalError局部变量

时间:2016-08-25 23:10:17

标签: python django variables scope

我有以下基于功能的视图

HashSet

当我执行调用此函数的url时,我收到以下错误

Set<String> movies = new HashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");

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 cd变量在最后与results句子不同的范围内声明和使用。

出于这个原因,错误。

我已经将这些变量初始化为这种方式的全局变量:

total_results

之前的条件句

return render(request ...)

我的GET请求是有效的

cd = results=total_results=None 

我可以用另一种方式解决这个问题吗? 此功能适用于在网络中搜索, 当我有很多用户使用此功能时这是否很好?

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

2 个答案:

答案 0 :(得分:1)

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

在第一个if条件之前添加cd = results = total_results = None。因为,在您当前的代码中,如果任何if条件失败,cdresultstotal_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})

答案 1 :(得分: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})

这项工作很好。 享受