如何修复分配前引用的错误局部变量“ ListQuery”

时间:2019-08-08 05:15:38

标签: django list filter

我在views.py中有一个列出所有记录的功能,并允许用户搜索特定的记录,如果对类“怀疑” 进行过滤,我遇到的问题是一旦我尝试搜索系统崩溃并显示以下错误:

  

分配请求之前引用的本地变量“ ListQuery”   方法:GET请求URL:http://127.0.0.1:8000/blog/list/ Django   版本:2.1.3异常类型:UnboundLocalError异常值:
  分配异常之前引用了局部变量“ ListQuery”   位置:C:\ Users \ LT GM \ Desktop \ ABenvironment \ myABenv \ blog \ views.py   在listANDsearch中,第186行Python可执行文件:C:\ Users \ LT   GM \ AppData \ Local \ Programs \ Python \ Python37 \ python.exe Python   版本:3.7.1

追踪

  

环境:

     

请求方法:GET请求URL:http://127.0.0.1:8000/blog/list/

     

Django版本:2.1.3 Python版本:3.7.1已安装的应用程序:   ['django.contrib.admin','django.contrib.auth',   'django.contrib.contenttypes','django.contrib.sessions',   'django.contrib.messages','django.contrib.staticfiles','blog',   'widget_tweaks','import_export']已安装的中间件:   ['django.middleware.security.SecurityMiddleware',   'django.contrib.sessions.middleware.SessionMiddleware',   'django.middleware.common.CommonMiddleware',   'django.middleware.csrf.CsrfViewMiddleware',   'django.contrib.auth.middleware.AuthenticationMiddleware',   'django.contrib.messages.middleware.MessageMiddleware',   'django.middleware.clickjacking.XFrameOptionsMiddleware']

     

跟踪:

     
    

文件“ C:\ Users \ LT     GM \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ django \ core \ handlers \ exception.py“     在内部       34. response = get_response(request)

         

文件“ C:\ Users \ LT     GM \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ django \ core \ handlers \ base.py“     在_get_response中       126. response = self.process_exception_by_middleware(e,request)

         

文件“ C:\ Users \ LT     GM \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ django \ core \ handlers \ base.py“     在_get_response中       124. response = wrapd_callback(request,* callback_args,** callback_kwargs)

         

文件“ C:\ Users \ LT GM \ Desktop \ ABenvironment \ myABenv \ blog \ views.py”在     列表和搜索       186. elif ListQuery == []:

         

异常类型:/ blog / list /异常值:UnboundLocalError     赋值之前引用的本地变量“ ListQuery”

  

views.py

def listANDsearch(request):
    #deny anonymouse user to enter the  list page
    if not request.user.is_authenticated:
            return redirect("login")
    else:
        queryset = suspect.objects.all()
        # return render(request,"blog/list.html", {"object_list":queryset})

        #search 
        query=request.GET.get("q")
        print("search for :",query)

        if query == "":
            messages.error(request,"Search field is empty!")
            print("Search field is empty!!!!!!!!!!!!!!!!")

        elif query:

            queryset_list=queryset_list.filter(
              Q(suspect_name__icontains=query)|
              Q(suspect_father_name__icontains=query)|
              Q(suspect_mother_name__icontains=query)|
              Q(content__icontains=query)|
              Q(create_date__icontains=query)
                  # Q(user__first_name__contains=query)
            ).distinct()
            ListQuery = list(queryset_list)
            #paginator in order to make several pages 
            paginator = Paginator(queryset_list, 10) # Show 5 items per page
            page_request_var = "page"#this line to change dynamicly the string befor the number of page like **page 1** or **abc 1**
            page = request.GET.get(page_request_var)
            queryset = paginator.get_page(page)

            context={
                "object_list":queryset,
                "title":"List Items",
                "page_request_var":page_request_var,
            }
            return render(request,"blog/list.html", context)
        elif ListQuery == []:
            messages.error(request,"Record not found/does not exist!")
            print("Record does not exist!!!!!!!!!!!!!!!!")

1 个答案:

答案 0 :(得分:0)

您有一个带有3个独立条件的if语句。您已经在第二个中定义了ListView并尝试在第三个条件语句中访问它。因此,您会收到此错误。您需要更新代码,例如:

# views.py
def listANDsearch(request):
    try:
        #deny anonymouse user to enter the  list page
        if not request.user.is_authenticated:
            return redirect("login")
        else:
            queryset = suspect.objects.all()
            # return render(request,"blog/list.html", {"object_list":queryset})

            #search 
            query=request.GET.get("q")
            print("search for :",query)

            if query == "":
                messages.error(request,"Search field is empty!")
                print("Search field is empty!!!!!!!!!!!!!!!!")
                return redirect("login")

            elif query:

                queryset_list=queryset_list.filter(
                  Q(suspect_name__icontains=query)|
                  Q(suspect_father_name__icontains=query)|
                  Q(suspect_mother_name__icontains=query)|
                  Q(content__icontains=query)|
                  Q(create_date__icontains=query)
                      # Q(user__first_name__contains=query)
                ).distinct()
                ListQuery = list(queryset_list)

                # move your conditional statement here
                if ListQuery == []:
                    messages.error(request,"Record not found/does not exist!")
                    print("Record does not exist!!!!!!!!!!!!!!!!")
                    return redirect("login")
                else:
                    #paginator in order to make several pages 
                    paginator = Paginator(queryset_list, 10) # Show 5 items per page
                    page_request_var = "page"#this line to change dynamicly the string befor the number of page like **page 1** or **abc 1**
                    page = request.GET.get(page_request_var)
                    queryset = paginator.get_page(page)

                    context={
                        "object_list":queryset,
                        "title":"List Items",
                        "page_request_var":page_request_var,
                    }
                    return render(request,"blog/list.html", context)
    except Exception as e:
        print("Exception occurred.")
        return redirect("login")