Crazy Django Error - 赋值前引用的变量

时间:2017-04-11 10:20:41

标签: python django django-views

尝试创建django应用程序但出现UnboundLocalError at /search/ local variable 'results' referenced before assignment错误。我无法看到问题,因为我的代码结果已分配 - 请查看:

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})

5 个答案:

答案 0 :(得分:2)

也许你应该初始化结果。 将results = []放在if form.is_valid()

之前

答案 1 :(得分:2)

如果没有结果,这取决于你想要做什么。你还想加载视图吗?然后将results变量初始化为任何if条件(在本例中为外部条件):

...
results = [] #Or whatever empty datatype you need
if 'query' in request.GET:
   ...

如果您不想在没有结果的情况下加载视图,那么当您确定时,您可以移动内部return render(...)内的if一个results变量开头。然后,您可以在函数末尾添加后备return render(...),超出任何if条件。

但是,如果您总是想要加载相同的视图,我只会选择第一个视图。当您想要在未找到结果时加载其他视图时,添加多个return render(...)似乎更合适。

答案 2 :(得分:2)

如果form无效,该怎么办?例如,用户根本没有提供不正确的值?在这种情况下,results未初始化。你可以:

  1. 使用[]等空值初始化它。

  2. 提出错误并返回表单无效的用户信息。

答案 3 :(得分:1)

def post_search(request):
    cd = ""
    total_results = ""
    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})

现在你必须在模板中编写验证码

答案 4 :(得分:0)

如果要以递归方式使用定义(根据您的情况计算结果),您应该在定义之外分配var结果,因为如果您这样做,它将在每次调用时重置。您必须将其分配给定义并将其声明为全局变量。

global results 
results = ''

我个人建议您在使用Django进行编码之前,先在python上进行更多的阅读和学习。

祝你好运! :)