首页 > 解决方案 > 分配前引用的 /products/search/ 局部变量“查询”处的 UnboundLocalError

问题描述

我有这个问题

分配前引用的 /products/search 局部变量“查询”处的 UnboundLocalError

/在此代码帮助下,我正在使用标题和类别搜索产品

def search(request):
    try:
        q = request.GET.get('q', '')
    except:
        q = False
    if q:
        query = q

    product_queryset = Product.objects.filter(
        Q(name__icontains=q)|
        Q(description__icontains=q)
    )
    category_queryset = Category.objects.filter(
        Q(title__icontains=q)|
        Q(description__icontains=q)
    )
    results = list(chain(product_queryset,category_queryset))
    context = {
        'query':query,
        'product_queryset':product_queryset,
        'category_queryset':category_queryset,
        'results':results,
    }

    return render(request,"products/search.html", context)

标签: pythondjangodjango-modelsdjango-forms

解决方案


就像塞尔丘克所说,你没有定义query是否q为无/假。尝试:

def search(request):
    try:
        q = request.GET.get('q', '')
    except:
        q = False
    if q:
        query = q
    else:
        query = None

    product_queryset = Product.objects.filter(
        Q(name__icontains=q)|
        Q(description__icontains=q)
    )
    category_queryset = Category.objects.filter(
        Q(title__icontains=q)|
        Q(description__icontains=q)
    )
    results = list(chain(product_queryset,category_queryset))
    context = {
        'query':query,
        'product_queryset':product_queryset,
        'category_queryset':category_queryset,
        'results':results,
    }

    return render(request,"products/search.html", context)

我们不确定query应该是什么或您如何使用它。将其设置为 None 应该可以修复 UnboundLocalError。

我也看不出有任何理由需要包装q = request.GET.get('q', '')在 try/except 块中。如果未定义,get将返回 '' 。q您可以将代码简化为:

def search(request):
    q = request.GET.get('q', '')

    product_queryset = Product.objects.filter(
        Q(name__icontains=q)|
        Q(description__icontains=q)
    )
    category_queryset = Category.objects.filter(
        Q(title__icontains=q)|
        Q(description__icontains=q)
    )
    results = list(chain(product_queryset,category_queryset))
    context = {
        'query': q,
        'product_queryset':product_queryset,
        'category_queryset':category_queryset,
        'results':results,
    }

    return render(request,"products/search.html", context)

模板形式

    <form method="get" action="{% url 'products:search' %}">
        <button class="flex-c-m trans-04">
            <i class="zmdi zmdi-search"></i>
        </button>
        <input class="plh3" type="text" placeholder="Search..." name="q">
    </form>

推荐阅读